Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP::如何从扩展类调用静态方法(或属性)?_Php_Oop_Static - Fatal编程技术网

PHP::如何从扩展类调用静态方法(或属性)?

PHP::如何从扩展类调用静态方法(或属性)?,php,oop,static,Php,Oop,Static,我有Model课,还有Model\u Something课Model\u某物具有静态属性(表名) 我想从Model类访问Model\u Something静态属性。 但它试图在模型中找到它,并给我一个例外: ErrorException [ Fatal Error ]: Access to undeclared static property: Model::$_collection_name 我尝试通过以下方式访问它: self::$some_property; 如何获得它?父项:$so

我有Model课,还有Model\u SomethingModel\u某物具有静态属性(表名)

我想从Model类访问Model\u Something静态属性。 但它试图在模型中找到它,并给我一个例外:

ErrorException [ Fatal Error ]: 
Access to undeclared static property: Model::$_collection_name
我尝试通过以下方式访问它:

self::$some_property;

如何获得它?

父项:$some\u属性这会降低代码的可靠性,就像您更改类名一样,如果您使用类名,您也必须在此处进行更改。

您不应该访问不存在的类中的属性,而该属性依赖于它在子类中的存在。父母不能/不应该知道孩子在做什么,而应该反过来。因此,首先,在父级中声明属性,以便父级在任何情况下都可以访问它。然后,子对象可以重写属性的值。为了确保始终访问正在执行的类的属性,需要使用后期静态绑定,这是通过使用
static
而不是
self
获得的:

static::$some_property; 

请包括
Model\u Something
Model
类的声明。哪个类扩展哪个?您可能需要检查父类是否需要访问子类的属性,那么该属性可能在所有子类中都可用。为什么不把它移到父类呢?这还有一个优点,即父级不需要知道子级的实现细节;else类_名称::$some_属性;如果子类重写了的属性。假设您拥有类a(具有属性x),类b(具有属性x)扩展类a,类c(具有属性x)扩展类b,并且您希望访问类c的属性x而不是使用self:$a,并且您希望访问类b的属性x而不是使用b:$aAs在现实生活中,父级不应依赖其子级;)因为你知道当他们18岁的时候,他们就会跑出去,让你一个人呆着