我对Opencart oo编程很感兴趣。
在opencart中,从任何控制器文件中,我们都可以很容易地看到这样的编程风格: -
class ControllerAccountAddress extends Controller {
private $error = array();
public function index() {
if (!$this->customer->isLogged()) {
$this->session->data['redirect'] = $this->url->link('account/address', '', 'SSL');
}
我可以看到,在ControllerAccountAddress类中,作者可以立即分配由其他类生成的属性,这些属性至少不是来自扩展的Controller类或同一个php页面。因此,我怀疑,其他类创建的一些公共属性可用于在“index”方法中使用。
然而,当我尝试这样的另一个类时: -
<?php
class Language{
public $lang;
function __construct($the_lang) {
$this->lang = $the_lang;
}
function get_lang(){
echo $this->lang;
}
}
?>
<?php
$try = new Language('English');
$try->get_lang();
?>
结果将是“英语”。
然后,我尝试创建另一个类: -
<?php
class Person {
public $name;
function trial() {
$something = $this->lang . "OK";
}
}
?>
然后,无论我如何尝试,都不能使用$ this-&gt; lang,我怀疑它不适用于此方法。
我能做些什么才能生成可用于其他类方法的属性?
答案 0 :(得分:1)
$this->lang
属性,因此无法使用 $lang
。
当一个类由其他类组成时,您需要的是组合。
基本上这意味着一个对象具有保存另一个对象的属性。
所以你想要Composition,你需要Dependency Injection才能启用它。
对于使用语言的人,你需要这个:
class Person {
public $name;
public $lang; // This is object!
public function __construct($lang) {
$this->lang = $lang;
}
}
$lang = new Language();
$john = new Person($lang);
现在您可以访问以下语言:
$jonh->lang->method();
此示例显示如何使用依赖注入通过对象构造函数推送对象。只需阅读有关合成和依赖注入的更多信息。
希望这有帮助!
答案 1 :(得分:0)
类Person与语言没有任何共同之处,因此您不能在其中使用$lang
。
但是...
你可以有一个领域,例如。类$mother_language
中的Person
就像这样
class Person {
public $name;
public $mother_language;
function __construct(){ // just to initialize $mother_language
$this->mother_language = new Language('English');
}
function trial() {
$something = $this->mother_language->lang . "OK";
}
}