OOP in PHP, $this->


OOP in PHP, $this->

对于我这个PHP OO新手来说,下面的代码中有一些不清楚的地方。对于$this->namename从何而来?至于$this->get_pinn_number,为什么我必须使用get_pinn_number作为声明的函数/方法名称才能使其工作?

对于扩展班员工,为什么我不能使用$this->name = $employee_name

class person {  
    var $name;
    public $pinn_number;
    function __construct($persons_name) {
        $this->name = $persons_name;
    }
    function set_name($name="Jay") {
        $this->name = $name;
    }
    function get_name() {
        return $this->name;
    }
    public function get_pinn_number($pinn_number) {
        $this->get_pinn_number = $pinn_number;
        return;
    }
}

class employee extends person {
    function __construct($employee_name) {
         $this->set_name($employee_name);
    }
}

谢谢。

你应该把var $name改成protected $name,然后你就可以这么做了。因为构造函数已经在亲自设置名称了,所以你不必在employee中重新声明构造函数来做同样的事情。

$name来自父类:

class person {  
    var $name;
/// ....
class employee extends person {

由于employee扩展了person,它也得到了所有的属性。

话虽如此,var并不是声明属性的最佳方式。对于大多数情况,您最好使用publicprivate

最后,可以在代码中使用$this->name=$employee_name,但使用父类函数的想法是允许它执行任何应该执行的任务。假设该函数验证进入它的数据,因为它需要在父类的另一个函数中使用它。如果你只是设置它,它很可能会破坏你稍后调用的另一个函数。

对于您的第二个问题,您应该使用:

当您希望使变量/函数在扩展当前类的所有类中可见时,protected作用域。

public作用域,使该变量/函数可从对象的任何位置、其他类和实例中使用。

当您希望变量/函数仅在其自己的类中可见时,private作用域。

因为在employee类中,$this表示员工类。$nameperson类的变量,因此不能使用$this调用父类的变量。您可以在employee类中使用$this->set_name(),因为它扩展了person类并且是公共方法。

why I cannot use $this->name = $employee_name instead?

您可以,但使用setter可能是一种很好的做法,因为主类开发程序可能添加了比this->x=x更多的代码。尽管如此,如果是这样的话,它应该设置为私有的,以强制您使用setter。

注:不再需要声明类成员变量。它将在PHP5中工作,但在版本5.3之前的PHP5中会引发E_STRICT警告,从那时起,它已被弃用。