0

我对 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 页面中。因此,我怀疑,其他类创建的一些公共属性可以在这种“索引”方法中调用使用。

但是,当我尝试另一个这样的课程时:-

<?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->lang 都无法使用,我怀疑它不适用于此方法。

我该怎么做才能生成可用于其他类方法的属性?

4

2 回答 2

1

$this->lang不能使用,因为 Person 对象没有$lang属性。当一个类由其他类组成时,您需要的称为组合。基本上,这意味着一个对象具有持有另一个对象的属性。

所以你想要组合,你需要依赖注入来启用它。

要使人使用语言,您需要:

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();

此示例向您展示如何使用依赖注入通过对象构造函数推送对象。只需阅读有关组合和依赖注入的更多信息。

希望这可以帮助!

于 2013-04-09T12:01:17.153 回答
0

Person 类与 Language 没有任何共同之处,因此您不能$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";
  }
}
于 2013-04-09T12:00:32.723 回答