对于我这个PHP OO新手来说,下面的代码中有一些不清楚的地方。对于$this->name
,name
从何而来?至于$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
并不是声明属性的最佳方式。对于大多数情况,您最好使用public
或private
。
最后,可以在代码中使用$this->name=$employee_name
,但使用父类函数的想法是允许它执行任何应该执行的任务。假设该函数验证进入它的数据,因为它需要在父类的另一个函数中使用它。如果你只是设置它,它很可能会破坏你稍后调用的另一个函数。
对于您的第二个问题,您应该使用:
当您希望使变量/函数在扩展当前类的所有类中可见时,protected
作用域。
public
作用域,使该变量/函数可从对象的任何位置、其他类和实例中使用。
当您希望变量/函数仅在其自己的类中可见时,private
作用域。
因为在employee
类中,$this
表示员工类。$name
是person
类的变量,因此不能使用$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警告,从那时起,它已被弃用。