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 - Fatal编程技术网

Php 将公共属性从一个类应用到另一个类

Php 将公共属性从一个类应用到另一个类,php,oop,Php,Oop,我对Opencart oo编程感兴趣 在opencart中,从任何控制器文件中,我们都可以很容易地看到如下编程风格:- class ControllerAccountAddress extends Controller { private $error = array(); public function index() { if (!$this->customer->isLogged()) { $this-&g

我对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');
}
<?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();
?>
我可以看到,在ControllerAccountAddress类中,作者可以立即分配由其他类生成的属性,这些属性至少不是来自扩展控制器类或同一php页面。因此,我怀疑,在这种“索引”方法中,可以调用由其他类创建的一些公共属性

然而,当我尝试另一个类似这样的课程时:-

class ControllerAccountAddress extends Controller {
    private $error = array();
    public function index() {
            if (!$this->customer->isLogged()) {
                $this->session->data['redirect'] = $this->url->link('account/address', '', 'SSL');
}
<?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都无法使用,我怀疑它不适用于此方法


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

类人员与语言没有任何共同之处,因此不能在其中使用
$lang

但是

您可以在类
Person
中有一个字段,例如
$mother\u language
,如下所示

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";
  }
}

$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();
此示例演示如何使用依赖项注入通过对象构造函数推送对象。请阅读更多关于组合和依赖项注入的内容


希望这有帮助

要访问类person中语言的属性,您需要对其进行扩展,即类person扩展语言您不应该在object Constructor中实例化新对象,依赖项应该从外部推送,因此使用该类的任何人都知道该类依赖于什么@Matija你能看看我的问题吗?是的,我确实看了你们的问题,我仍然可以告诉你们,使用依赖注入然后在构造函数中实例化对象更好。如果你做了任何单元测试,你应该知道这一点。当你在构造函数中实例化依赖项时,你不能使用mock object等。根据我所引用问题的讨论结果,我可以同意Matija的解决方案更好。