Re: [SMARTY] Re: object calls fail after upgrade to 2.6.4
hans <[email protected]>
| Newsgroups | gmane.comp.php.smarty.devel,gmane.comp.php.smarty.general |
|---|---|
| Message-ID | <[email protected]> |
Hi Monte,
On Thu, 9 Sep 2004, Monte Ohrt wrote:
> The reason objects as parameters to objects was not allowed is because
> PCRE does not support infinite recursion, and this would certainly not
> be practical to parse:
>
> {$foo->bar($foo->bar($foo->bar(...)))}
Oh yes, I see. If only PHP had a Parse::RecDescent as Perl has :-)
> However, since there is code relying on these little discrepancies, I
> have just committed to CVS the ability to do one level of object
> nesting. So, this is valid syntax:
>
> {$foo->bar($foo->bar))}
> {$foo->bar($foo->bar()))}
> {$foo->bar($foo->bar($foo)))}
> {$foo->bar($foo->bar($foo,$bar.blah,0))}
>
> However this is NOT permitted:
>
> {$foo->bar($foo->bar($foo->bar)))}
This is very good news! One level should be sufficient.
> Please test and let me know if there are problems.
It looks pretty good now. I could only find one case that is still causing
a parser error:
{$obj->meth("foo", $obj->val)}
To make your life easier, I have extended the testcase that I sent earlier
today. It includes the above failing case. Maybe it could be integrated in
the unit test suite.
A last word: thank you very much for your quick help on this matter. It is
very much appreciated.
Hans
--
Smarty Development Mailing List (http://smarty.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
test_assign_obj.txt
(text/plain, 1.6 KB)
Index: unit_test/test_cases.php
===================================================================
RCS file: /repository/smarty/unit_test/test_cases.php,v
retrieving revision 1.7
diff -u -r1.7 test_cases.php
--- unit_test/test_cases.php 12 Apr 2004 12:21:39 -0000 1.7
+++ unit_test/test_cases.php 9 Sep 2004 17:03:17 -0000
@@ -3,6 +3,16 @@
require_once './config.php';
require_once SMARTY_DIR . 'Smarty.class.php';
require_once 'PHPUnit.php';
+
+class Obj {
+ var $val = 'val';
+ var $arr = array('one' => 'one');
+
+ function meth($a="a", $b="b") {
+ return "$a:$b";
+ }
+}
+
class SmartyTest extends PHPUnit_TestCase {
// contains the object handle of the string class
@@ -230,6 +240,22 @@
$this->smarty->assign('foo', 'bar');
$this->assertEquals($this->smarty->fetch('assign_var.tpl'), 'bar');
}
+
+ // test assigning and calling an object
+ function test_obj_meth() {
+ $obj = new Obj();
+ $this->smarty->assign('obj', $obj);
+ $this->smarty->assign('foo', 'foo');
+ $this->assertEquals(
+'foo:2.5
+2.5:foo
+2.5:b
+val:foo
+foo:val
+foo:foo
+one:2
+foo:foo:b', $this->smarty->fetch('assign_obj.tpl'));
+ }
/* CONFIG FILE TESTS */
unit_test/templates/assign_var.tpl
===================================================================
{$obj->meth($foo, 2.5)}
{$obj->meth(2.5, $foo)}
{$obj->meth(2.5)}
{$obj->meth($obj->val, "foo")}
{$obj->meth("foo", $obj->val)}
{$obj->meth("foo", $foo)}
{$obj->meth($obj->arr.one, 2)}
{$obj->meth($obj->meth("foo", $foo))}