首页 > 代码库 > 细数php语法里的那些“坑”

细数php语法里的那些“坑”

尽管PHP的语法已经很松散,写起来很“爽”。但是对于像“我们”这种学过 Java、 C#的“完全面向对象程序员”来说,PHP程序设计语言里,还是有一些的坑的。下面请让我来盘点一下。

 

Parse error: syntax error, unexpected T_STRING, expecting T_FUNCTION in......

  错误原因:在PHP语法中,声明任何函数,函数名的前面需要 function 关键字。

<?php//错误代码如下class Test{  __construct(){    echo ‘I am construction!‘;      }    }

  正确示例:每一次声明函数(方法),都要写上“function”这个关键字。无论您想声明的是 __construct()这类魔术方法,还是自定义函数,都逃不出 function 的手掌心。

<?phpclass Test{  //正确代码如下    function __construct(){        echo ‘I am construction!‘;    }}

 

 

Fatal error: Access to undeclared static property: ......

   错误原因:self::只能指向静态属性,而指向非静态属性只能用 $this->。

<?php//错误代码class Person{    function __construct($name){        self::$name = $name;    }    private $name;}$paul = new Person(‘paul‘);

  正确方法:self::指向静态属性,$this->指向非静态属性。

<?php//正确代码 $thisclass Person{    function __construct($name){        $this->$name = $name;    }    private $name;}$paul = new Person(‘paul‘);

 

<?php//正确代码 self::class Person{    function setBirthday($date){        self::$birthday = $date;    }    static private $birthday;}$paul = new Person();$paul->setBirthday(‘1990-01-01‘);

 

Fatal error: Cannot redeclare A::__construct() in......

  错误原因:PHP不支持函数重载

  解决方法:使用PHP内置函数 func_num_args() 、func_get_arg() 、func_get_args()来模拟实现OOP的函数重载

<?phpclass Test{    function __construct(){        switch(func_num_args()){            case 0:                echo ‘no argument‘;            default:                echo ‘the number of arguments is ‘.func_num_args(). ‘<br />‘;                $argumentArray = func_get_args();                //遍历方法一                foreach($argumentArray as $key => $value){                    echo ‘the No‘. $key. ‘ argument is ‘. $value. ‘<br />‘;                }                echo ‘<br />‘;                //遍历方法二                for($i=0; $i<func_num_args(); $i++){                    echo ‘the No‘. $i. ‘ argument is ‘. func_get_arg($i). ‘<br />‘;                }        }        echo ‘<hr />‘;    }}new Test();new Test(1);new Test(1,2,3);

 

 

自动初始化对象