我想要做的是使用“extends”将几个类链接在一起。它有点起作用,但不像我预期的那样。所以我一定做错了。
从我收集的内容来看,当你扩展一个类时,你继承了它的所有属性。所以考虑到这一点,我想让我的配置文件在所有类中都可用。为此,我想扩展autoLoader类的所有类。这对我来说似乎合乎逻辑,但如果我错了,请纠正我。
我有两个班级
自动装载
Class AutoLoader {
public $oConf = null;
public function __construct($oConfig) {
$this->$oConf = $oConfig;
}
public function getConf() {
return $this->$oConf;
}
}
其他班级
Class foo extends AutoLoader {
public function bar() {
var_dump($this->getConf());
}
}
我的问题是,为什么var_dump为NULL。
这对我来说很奇怪因为这总是会让conf:
$autoLoader = new AutoLoader($array);
var_dump($autoLoader->getConf());
我在这里缺少什么。
答案 0 :(得分:4)
您正在扩展和继承类结构,而不是对象实例。
请以此代码为例:
$foo = new Foo('foo');
$bar = new Foo;
您是否希望$bar
能够以某种方式访问传递给第一个对象的参数'foo'
?不,扩展名没有改变。
您应该使用合成或依赖注入(例如,将自动加载器传递给Foo
的构造函数)。不要Foo
Autoloader
,如果需要,给 Autoloader
。扩展类时,新类 也是其父类。这意味着它可以用代替父类。在您使用Autoloader
课程的任何地方,您都可以替换Foo
。那有意义吗? Foo
是 Autoloader
吗? $foo instanceof Autoloader == true
有道理吗?否。
答案 1 :(得分:1)
如果继承类有自己的构造函数,那么在这种情况下你可能没有将oConfig传递给父类(Autoloader)。
另外,你的构造函数需要一个配置。
所以如果你没有,你应该在你的子构造函数中执行此操作:
function __construct($oConfig) {
parent::__construct($oConfig);
// rest of your constructor code here
}
答案 2 :(得分:1)
您应该创建foo
类的实例,并将构造变量提供给构造函数:
$config = 'My_config';
$foo = new foo($config);
$foo->bar();
将输出:
(string) "My_config"