在 php 手册中,他们将范围解析运算符定义如下:
范围解析运算符(也称为 Paamayim Nekudotayim)或更简单的术语是双冒号,是一个允许访问类的静态、常量和重写属性或方法的标记。
我的理解是,由于我们无法使用 评估静态属性、类常量和静态方法$this
,因此我们需要::
. 我不明白为什么::
允许从类内部评估非静态函数。可以说,子类可能想用 评估父类中定义的方法parent::baseClassMethod()
,但它可能也想评估父类中定义的属性,但::
无法评估属性。可以说父类的属性是继承的,所以我们可以简单地用 来评估它们$this->prop
,但方法也是如此。我们::
仅在子类中重写方法时才使用 for 方法。同样我们需要::
评估子类中的覆盖属性。与 php 手动定义相反,如果您尝试使用 评估覆盖的属性::
,则会引发错误。
为了说明我的观点,我有以下示例 PHP 代码:
error_reporting(E_ALL);
class myClass {
private $prop = 786;
public $prop2 = 123;
public function changeType($var, $type){
settype($var, $type);
echo "function assessed through self";
}
public function display_prop(){
self::changeType(1, "string"); //why does this not throw error for non static function?
var_dump(self::$prop); //throws error; can't assess properties with self as expected.
}
}
class childCLass extends myClass {
public $prop2 = "new"; //overriden property.
public function display_prop(){ //overriden method.
echo "I do different things from the base class". "</br>";
}
public function dsiplay_overriden(){
echo parent::$prop2; //Why can't assess overriden properties, as suggested in the definition?
}
}
$obj = new myClass;
$obj->display_prop();
$obj2 = new childCLass;
$obj2->display_prop();
$obj2->dsiplay_overriden();
childClass::display_prop(); //This throws error as expected because non-static method.
总结一下,我主要有两个具体问题:
- 为什么我们不能访问
::
定义中定义的覆盖属性? ::
与定义相反,为什么我们可以访问类中的非静态函数?
PS:在stackoverflow上也提出了类似的问题。不存在令人满意的答案,而且我正在寻找更适合programmers.stackexchange 的概念性和有见地的答案。