【问题标题】:Variables of parent class to all childs父类对所有子类的变量
【发布时间】:2012-08-21 05:31:16
【问题描述】:

我有一个这样的类结构:

class general {

    private $var;

    function set_val( $val ) {
        $this->var = $val;
    }

    function get_val() {
        return $this->var;
    }

}


class A extends general {

    function __construct( $val ) {
        parent::set_val( $val );

    }

    ....

}


class B extends general {

    ....

}

对应的主脚本是这样的:

<?php
$a = new A( "Apple" );
$b = new B();

echo "A: " . $a->get_val();
echo "B: " . $b->get_val();

哪个输出:

A: Apple
B:

现在的问题是 A 和 B 的所有实例都访问它们自己的父类 general 的变量 $var ,因此所有 $var 都是相互独立的。

有没有一种方法可以在父类 general once 中设置变量 $var ,然后自动将其提供给 all classes,这些类是/extends general 的子类? (因此 $b->get_val() 也输出“Apple”?!)

背景:我想在通用类中加载具有语言相关值的变量。然后这些变量应该可供所有子类使用。

【问题讨论】:

    标签: php oop


    【解决方案1】:

    数据不会在不同对象之间自动共享。您可以使用静态访问的static 类属性,它本质上是一个全局变量。但这通常是个坏主意,因为对象提供的封装通常被认为是一件好事。

    【讨论】:

      【解决方案2】:

      理想情况下,如果您希望在您的代码中让对象共享公共数据,最好将它们分离到另一个对象中并在代码中使用该对象。

      示例:独立于语言的数据可以进入一个单独的类,以迎合语言独立的功能。但是,如果由于某些限制您只需要使用一个类,那么唯一的选择是将它们作为该类的静态成员。

      【讨论】:

        【解决方案3】:

        将 $var 声明为受保护而不是私有。 私有变量只对声明它们的类可用,对子类不可用。 受保护的变量对定义类和扩展父类的所有类都可用。

        【讨论】:

        • 即使有受保护的声明,也不会有 A 对象设置的“Apple”值可用于 B 对象?!因此输出不会改变......?!
        猜你喜欢
        • 2010-10-14
        • 2019-09-15
        • 2020-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多