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

问题描述:

我有模型类,和模型_什么类。 Model_Something有静态属性(表名)。PHP ::如何从扩展类调用静态方法(或属性)?

我要访问Model_Something static property from Model class。 但它试图找到它在模式类,并给我的异常:

ErrorException [ Fatal Error ]: 
Access to undeclared static property: Model::$_collection_name 

我尝试访问它以这样的方式

self::$some_property; 

如何获得呢?

+0

请包括'Model_Something的声明'和'Model'类。哪个类扩展了哪个? – 2012-08-12 11:07:35

+0

你可能想检查[这个问题](http://*.com/questions/1349637/correct-implementation-of-virtual-functions-in-php) – 2012-08-12 11:13:53

+0

如果父类需要访问子类的属性,那么该属性应该可用于所有的子类。为什么不把它移到父类呢?这也有一个好处,即父母不需要知道孩子的实施细节。 – Arjan 2012-08-12 11:21:54

你不应该访问一个不存在的类的属性,并依赖它存在于孩子中。家长不能/不应该知道孩子是做什么的,它必须是相反的。因此,首先在父级中声明属性,以便父级可以在任何情况下访问它。然后孩子可以覆盖该房产的价值。为了确保您始终访问执行类的属性,你需要后期静态绑定,您可以通过使用static,而不是self得到:

static::$some_property; 

http://php.net/manual/en/language.oop5.late-static-bindings.php

+0

如同在现实生活中,父母不应该依赖它的孩子;) – 2012-08-12 11:28:04

+2

因为你知道他们只会用完,并让他们在他们转身的那一刻18.;) – deceze 2012-08-12 11:29:27

+0

我使用了static :: $ collection_name,它可以工作。谢谢 – 2012-08-12 13:34:47

parent :: $ some_property;它会使你的代码更不可靠,就像你改变你的类名一样,如果你使用类名,你也必须在这里改变。

+0

我想从父母代码 – 2012-08-12 11:06:41

+0

访问CHILD属性比** self :: $ some_property; ** else ** Class_name :: $ some_property; **如果该属性被子类覆盖。假设你有类a(带有属性x),类b(带有属性x)扩展了类a和类c(带有属性x)扩展了类b,并且你想访问类c的属性x比使用self :: $ a和你想访问b类的财产x比使用b :: $ a – 2012-08-12 11:26:59