OOP:获取由类 2 构造定义的类 1 的变量(扩展类 1)


OOP: Get variable of class1 defined by construct from class2 (extending class1)

我有以下类。我想要的是只定义一次,在主类(class1)中通过construct()一个变量,然后从扩展class1的其他类中调用该变量。

第1类

<?php
class Class1 {
    protected $var1;
    public function __construct( $var1 = '' ) {
        if ( !empty($var1) ) $this->var1 = $var1;
    }
    public function get_var() {
        return $this->var1;
    }
}

第2类

<?php
class Class2 extends Class1 {}

索引

<?php
require 'class1.php';
$class1 = new Class1( 'test' );
echo 'Class1: ' . $class1->get_var();
require 'class2.php';
$class2 = new Class2();
echo '<br>Class2: ' . $class2->get_var();

这里的结果是第一个 Echo 显示正确的值(测试 ),但第二个 no,只是一个空字符串。

那么,有一种方法可以在每次构造中定义变量的情况下执行此操作?

你可以用static来做这个想法,这样你就可以这样做:

<?php
class Class1 {
        protected static $var1;
        public function __construct( $var1 = '' ) {
            if ( !empty($var1) ) self::$var1 = $var1;
        }
        public function get_var() {
            return self::$var1;
        }
    }
    class Class2 extends Class1 {}
$class1 = new Class1( 'test' );
echo 'Class1: ' . $class1->get_var();

$class2 = new Class2();
echo '<br>Class2: ' . $class2->get_var();
?>

仔细检查你的代码:Class2 扩展了超类 Class1。Class1 在其自己的构造函数中具有分配给状态变量 $var 1(其访问权限设置为受保护)的 $var 1 参数。

调用子类(在本例中为 Class2)时,不会将任何内容传递给其自己的构造函数。此外,您没有在 Class2 代码中定义任何构造函数。你可以做这样的事情:

class Class2 extends Class1 {
    public function __construct($var1 = '') {
        parent::__construct($var1);
    }
}

这是怎么回事?您实际上是在覆盖__construct方法。如果不调用超类的方法__construct父::__construct,则只会执行 Class2 定义的方法。parent::{method_name} 将使您能够在重写的方法中调用 Class1 构造方法(在本例中,您正在扩展__construct功能)。

实例化 Class2 时,将字符串传递给构造函数,状态变量 $var 1 将被评估。请记住,扩展类会继承其所有属性和方法。

此示例工作正常。

如果目的是使用实例化的 class1,并且 class2 具有这些属性。如果 class2 也需要新属性,则可以使用不同的属性保留新的 class1,如下所示:

<?php
class Class1 {
    protected static $var1;
    public function __construct( $var1 = '' ) {
        if ( !empty($var1) ) self::$var1 = $var1;
    }
    public function get_var() {
        return self::$var1;
    }
}
    class Class2 extends Class1 {}
    $class1 = new Class1( 'test' );
    echo 'Class1: ' . $class1->get_var() . "'n";
    $class2 = new Class2();
    echo 'Class2: ' . $class2->get_var() . "'n";
    $class1 = new Class1( 'prod' );
    echo 'Class1: ' . $class1->get_var() . "'n";
    $class2 = new Class2();
    echo 'Class2: ' . $class2->get_var() . "'n";
?>

输出:

第1类:测试

第2类:测试

第 1 类:产品

第 2 类:产品