细数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 的手掌心。

<?php
class 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
//正确代码 $this
class 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的函数重载

<?php
class 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);

 

 

自动初始化对象

细数php语法里的那些“坑”,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。