【问题标题】:Can I use provided approach to access PHP variables in OOP?我可以使用提供的方法来访问 OOP 中的 PHP 变量吗?
【发布时间】:2014-08-25 15:18:19
【问题描述】:

这里有一些代码可以澄清这个问题。

Application.php:

class Application {
    var $class1;
    var $class2;

    function __construct() {
        include_once('Class1.php');
        include_once('Class2.php');

        $this->class1 = new Class1($this);
        echo $this->class1->testvar; // echoes 1

        $this->class2 = new Class2($this);
        echo $this->class1->testvar; // echoes 2
    }
}

Class1.php:

class Class1 {
    var $app;
    var $testvar = 1;

    function __construct($app) {
        $this->app = $app;
    }
}

Class2.php:

class Class2 {
    var $app;

    function __construct($app) {
        $this->app = $app;
        $this->app->class1->testvar = 2;
    }
}

这种方法有什么问题?

我注意到在某些情况下会发生递归,并且一致性不是嗯“一致”...

感谢您对此问题的任何帮助。

主要是我需要能够从 Class2 访问 Class1 变量,extends 不能很好地用于这些目的。

【问题讨论】:

  • 如果有人在没有 Class1 实例的情况下执行 new Class2 会发生什么?
  • 那会失败,但是这个订单是防弹的,因为它在应用程序中,没有用户输入可以改变订单。

标签: php class oop methods parent


【解决方案1】:

这个:

$this->app->class1->testvar = 2;

正在破坏Law of Demeter

得墨忒耳定律 (LoD) 或最少知识原则是一种设计 软件开发指南,尤其是面向对象的 程式。在其一般形式中,LoD 是松散的特定情况 耦合。该指南由东北大学提出 到 1987 年底,可以简明扼要地概括为 有以下几种方式:

  • 每个单元应该只对其他单元有有限的了解:只有 与当前单位“密切”相关的单位。
  • 每个单位只能与朋友交谈;不要和陌生人说话。
  • 只与您的直系朋友交谈。

基本概念是给定对象 应该尽可能少地假设结构或性质 其他任何东西(包括其子组件),按照 “信息隐藏”原则。

您的Class2Application 的外观做了很多假设,使Application 的设计变得不灵活,因为Class2 依赖于它。您应该只将立即需要的依赖项注入到类中以保持灵活性。 Class2 这样看起来会好很多:

class Class2 {

    protected $class1;

    public function __construct(Class1 $class1) {
        $this->class1 = $class1;
        $this->class1->setTestVar(2);
    }

}
  1. 创建属性protected 来封装它们。
  2. 如果您需要Class1,请输入Class1 的提示并需要Class1,而不是一些您并不真正需要的中间对象。
  3. 使用像setTestVar 这样的setter 方法而不是设置公共属性。再次:封装。只要方法 setTestVar 保持不变,您还可以灵活地更改 Class1 的内部实现。考虑在对象之间使用定义的接口,而不是乱搞其他对象的属性。

【讨论】:

    【解决方案2】:

    只需扩展 class1 以访问它的方法和变量,并且由于 class1 扩展了 class2 类,您还可以访问它包含的方法和变量

    你可以试试这个,

    应用程序.php

    include_once('class1.php');
    include_once('class2.php');
    
    class application extends class1{
    
        function hello(){
            // variable from class1
            echo $this->class1var."<BR>";
            // variable from class2
            echo $this->class2var."<BR>";
        }
    }
    

    class1.php

    class class1 extends class2{
        public $class1var = 'hello';
    }
    

    class2.php

    class class2 {
        public $class2var = 'world';
    }
    

    调用方法你好

    $app = new application();
    $app->hello();
    

    结果:

    hello
    world
    

    【讨论】:

    • 虽然这在这个有限的例子中可能有效,但在实践中这似乎不是一个合适的结构。您只有一个对象实例,而 OP 有三个;这是一个截然不同的场景和用例。
    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2017-11-11
    • 2018-06-17
    相关资源
    最近更新 更多