@@ -176,18 +176,69 @@ function &test(stdClass $foo = invalid)
176176"1 \1111 "
177177"1 \x111"
178178"$ foo "
179- "$ foo[bar]"
179+ "$ foo[bar]" // 'bar' is treated as a string automatically by PHP
180+ " {$ foo [bar]}" // 'bar' is treated as a *constant*
180181 "$ foo [0 ]"
181182"$ foo [$ bar ]"
182183"$ foo ->bar "
183- "$ foo->$ foo "
184+ "$ foo ->bar ( " // Should show as access to property ->bar, not as a call to ->bar()
185+ "$ foo-> $ bar " // Should not show as an object property access, but as two separate variables
184186"{$ foo-> $ bar} "
187+ "{$ foo-> {$ bar }} "
188+ "{$ foo-> $ {bar}} "
189+ "{$ foo-> {$ bar . $ baz }} "
185190"{$ foo ->bar } "
186191"{$ foo ->bar [0]->baz} "
187192"{$ foo ->bar (12, $ foo)} "
188193"{$ foo(12, $ foo)} "
189194
190195$ foo = $ foo->{'foo' . 'bar'};
196+ $ foo = $ foo->{ "foo{$ bar} " };
197+
198+ $ beer = 'Heineken ' ;
199+ echo "$ beer's taste is great " ; // works; "'" is an invalid character for variable names
200+ echo "He drank some $ beers " ; // won't work; 's' is a valid character for variable names but the variable is "$beer"
201+ echo "He drank some $ {beer}s " ; // works
202+ echo "He drank some {$ beer }s " ; // works
203+
204+ // The text "($str[1" should *not* be highlighted as a syntax error.
205+ $ str = array ("Foo " , "Bar " );
206+ echo 'Name: ' . $ str [($ str [1 ]) ? 1 : 0 ]; // Should echo "Name: Bar"
207+ echo "Name: {$ str [($ str [1 ]) ? 1 : 0 ]}" ; // Should echo "Name: Bar"
208+
209+ echo "{ \$" ;
210+ echo "$ foo " ;
211+ echo "{$ foo }" ;
212+ echo "$ {foo}" ; // 'foo' should be variable.other.php
213+ echo "$ foo-> $ {bar}" ; // '->' should not be keyword.operator.class.php
214+ echo "This works: " . $ arr ['foo ' ][3 ];
215+ echo "This works too: {$ obj ->values [3 ]->name }" ;
216+ echo "This is the value of the var named $ name: {$ {$ name }}" ;
217+ echo "This is the value of the var named by the return value of getName(): {$ {getName ()}}" ;
218+ echo "Blah: {$ {Foo::bar ()}}" ;
219+
220+ $ blah = $ foo [123 ];
221+ $ blah = $ foo [$ bar ];
222+ $ blah = $ foo [bar ()];
223+ $ blah = $ foo ->bar (123 );
224+ $ blah = $ {'foo ' };
225+
226+ $ blah = $ foo [123 ];
227+ $ blah = $ _POST ['blah ' ];
228+ $ blah = new $ _POST ['blah ' ];
229+ $ blah = new $ foo ;
230+ $ blah = new $ foo ->{$ bar };
231+ $ blah = new $ foo ->{$ bar . '123 ' };
232+ $ blah = new $ foo ->{$ {bar ()}};
233+
234+ $ bar = array (
235+ '123 ' => '321 ' ,
236+ );
237+ $ x = 2 ;
238+
239+ echo 'foo ' . $ bar ['1 ' . $ x . '3 ' ];
240+ echo 'foo ' . $ bar ["1 {$ x }3 " ];
241+ echo "foo {$ bar ["1 {$ x }3 " ]}" ;
191242
192243// Heredoc
193244$ foo = <<<BLAH
@@ -268,16 +319,32 @@ function &test(stdClass $foo = invalid)
268319// =======
269320// = SQL =
270321// =======
271- 'SELECT * from foo WHERE bar = \'foo \\ ' . $ foo . 'sadas';
322+ 'SELECT * from foo WHERE bar = \'foo \\ ' . $ foo . ' AND blah ' ;
323+ 'SELECT * from foo WHERE bar = \'foo \\ ' . $ foo . " AND blah " ;
272324'SELECT * from foo WHERE bar = "foo" asdas ' . $ foo . '" asdasd ' ;
273325
274326
275327"SELECT * from foo WHERE bar = 'asd $ foo $ foo ->bar {$ foo ->bar [12 ]} asda' 'unclosed string " ;
276- "SELECT * from foo WHERE bar = \"dsa $ foo \" \"unclosed string "
328+ "SELECT * from foo WHERE bar = \"dsa $ foo \" \"unclosed string " ;
277329'SELECT * from foo WHERE bar = "unclosed string ' ;
278330
331+ 'SELECT * from foo WHERE bar = ' . $ foo . ' bar" AND foo = 1 ' ;
332+ 'SELECT * from foo WHERE bar = ' . ' bar" AND foo = 1 ' ;
333+
279334'SELECT * from foo WHERE bar = "foo \" ' . $ foo . ' bar" AND foo = 1 ' ;
280335
336+ 'SELECT * FROM `foo ' . $ bar . '` WHERE foo = 1 ' . fasdf ('asdf ' ) . ' AND other = "blah" ' ;
337+ "SELECT * FROM `foo " . $ bar . "` WHERE foo = 1 " ;
338+ "SELECT * FROM `foo` WHERE foo = 'blah " . $ x . "' AND other = 'stuff' " ;
339+ "SELECT * FROM `foo` WHERE foo = ' {$ xblah }" . "' AND other = 'stuff' " ;
340+ // Something
341+
342+
343+ "SELECT * FROM `foo` WHERE foo = \"blah " . $ x . "\" AND other = 'stuff' " ;
344+ 'SELECT * FROM `foo` WHERE foo = "blah ' . '" AND other = "stuff" ' ;
345+ 'SELECT * FROM `foo` WHERE foo = "blah ' . $ x . '" AND other = "stuff" ' ;
346+ "SELECT * FROM \``foo " . $ bar . "` WHERE foo = 'blah' " ;
347+
281348// Comments
282349
283350'SELECT * FROM # foo bar \' asdassdsaas ' ;
@@ -499,4 +566,16 @@ function foo(
499566 return true ;
500567}
501568
569+ $ foo ->test ()
570+ /* something */
571+ ->blah ()
572+ // test
573+ ->oneMore ();
574+
575+ $ blah = "INSERT INTO foo SET blah = '12 " ; // Unclosed single quote should not be a problem
576+ $ blah = "INSERT INTO `catalogue` SET
577+ `model`=' {$ _POST ["page_row {$ count }_model " ]}',
578+ `type`=' {$ _POST ["page_row {$ count }_type " ]}'
579+ ; " );
580+
502581?>
0 commit comments