【问题标题】:Difference between extend a class and create instance in another class in php在php中扩展一个类和在另一个类中创建实例之间的区别
【发布时间】:2016-12-25 21:22:48
【问题描述】:

第一个文件:

class Class_one {

    public function __construct() {

    }

    public function show_name() {
        echo "My Name is Siam";
    }

    public function show_class() {
        echo "I read in class 7";
    }

}

第二个文件:

<?php

require_once './Class_one.php';

class Class_two {

    public $class_one;

    public function __construct() {
        $aa = new Class_one();
        $this->class_one = $aa;
    }

    public function history() {
        $this->class_one->show_name();
    }

}

$ab = new Class_two();
$ab->history();

如果我不在 class_two 中实例化 class_one 并将 class_one 扩展到 class_two 会发生什么?有什么区别吗?

【问题讨论】:

    标签: php oop instantiation


    【解决方案1】:

    这里只有一个潜在的陷阱:Class_two 将无法直接访问 Class_one 私有/受保护的方法和变量。这可能是一件好事(封装是一个类执行某些特定任务并且您不希望孩子干扰它的地方),但这也可能意味着您无法获得所需的数据。

    我建议您将 Class_two 作为依赖注入(如您的示例所示),但是

    class Class_two {
    
        public $class_one;
    
        public function __construct(Class_one $class) {
            $this->class_one = $class;
        }
    }
    

    【讨论】:

    • 如果我遵循您的建议,那么我需要在创建 class_two 的实例时传递 class_one 实例/对象。我说的对吗?
    • 这就是我的建议。如您所见,在构造函数中实例化它的唯一原因是它实际上是类的扩展(在这种情况下它应该是父类)
    • 术语“是它实际上是类的扩展(在这种情况下它应该是父类)”我不明白:(
    • 如果两个必须以特定方式实例化一个,那么两个应该扩展一个
    【解决方案2】:

    应该是语义上的区别:

    • 当两个类之间的关系可以用 to be 动词表示时,您可以使用继承。例如:我的福特是一辆汽车
    • 当两个类之间的关系可以用 to have 动词表达时,您可以使用关联/组合。例如:我的车有一个发动机

    在面向对象编程中选择继承或关联时,应首先考虑规则之上。一直有关于避免继承的讨论,有些人会争辩说你应该选择组合而不是继承。查看其他问答:Prefer composition over inheritance?

    就纯编码而言,正如@Machavity on his answer 已经说过的,使用组合而不是继承时可能存在可访问性限制,但我不会根据成员可访问性来决定使用哪种方法。

    【讨论】:

      猜你喜欢
      • 2018-11-02
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      相关资源
      最近更新 更多