php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #53616 T_LOGICAL_AND when declaring and() method in class
Submitted: 2010-12-27 16:26 UTC Modified: 2010-12-27 17:14 UTC
From: hey at lukecarrier dot me Assigned:
Status: Not a bug Package: Scripting Engine problem
PHP Version: 5.3.4 OS: Windows 7 x64
Private report: No CVE-ID: None
 [2010-12-27 16:26 UTC] hey at lukecarrier dot me
Description:
------------
When declaring a method named 'and' within a class, PHP throws a parse error 
because the function name is interpreted as a logical operator (T_LOGICAL_AND). 
This appears to be a bug, as it's clear in this context that the developer is not 
attempting to perform a comparison.

Test script:
---------------
<?php

    class LogicalOperatorTest {

        public function and() {
            echo "successful!";
        }

    }

?>

Expected result:
----------------
The method LogicalOperatorTest->and() to be declared.

Actual result:
--------------
Parse error: syntax error, unexpected T_LOGICAL_AND, expecting T_STRING in 
C:\pathto\lovely.php on line 5

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2010-12-27 16:28 UTC] felipe@php.net
-Status: Open +Status: Bogus
 [2010-12-27 16:28 UTC] felipe@php.net
This is expected.

http://docs.php.net/manual/en/tokens.php
 [2010-12-27 16:34 UTC] damian at damianzaremba dot co dot uk
That link explains the exception however I do not think that it should be thrown in this case. It is clear that a function is being defined rather than a logical comparison being performed.

In this context I believe it should have the result as expected above and only apply logical comparisons in valid circumstances such as in an if.

When defining this function, especially in a class it makes no sense to restrict it based in builtins or logical operators. For example defining function and() { echo "hi"; } would not affect if($bar === "foo" and $foo === "bar"){} in any way.
 [2010-12-27 16:47 UTC] rasmus@php.net
Yes, logically you are right, but we are limited by what the various lexers can 
do.  Neither yacc nor re2c is capable of contextual keyword distinction like that.
 [2010-12-27 17:09 UTC] hey at lukecarrier dot me
Rasmus, thanks for the explanation (it's an honour, by the way :)). Given that 
this limitation is present in upstream tools, is there any chance of this 
behaviour changing in future versions of PHP?
 [2010-12-27 17:14 UTC] rasmus@php.net
Very unlikely.
 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Tue Dec 02 06:00:01 2025 UTC