OOP:获取class2定义的class1的变量(扩展class1)

时间:2016-03-07 12:19:08

标签: php oop

我有以下课程。我想要的是通过 construct()在主类( class1 )中定义一个变量,然后从其他类中调用那些扩展class1的变量。 / p>

的Class1

<?php

class Class1 {

    protected $var1;

    public function __construct( $var1 = '' ) {

        if ( !empty($var1) ) $this->var1 = $var1;

    }

    public function get_var() {

        return $this->var1;

    }

}

的Class2

<?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显示正确的值(test),但第二个不显示,只是一个空字符串。

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

3 个答案:

答案 0 :(得分:1)

你可以用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();

?>

答案 1 :(得分:-1)

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

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

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

这里发生了什么?您实际上覆盖了__construct方法。如果不使用parent :: __构造调用超类的方法__construct,则只会执行Class2定义的方法。 parent :: {method_name}将使您能够在重写方法中调用Class1构造方法(在这种情况下,您将扩展__construct功能)。

当您将实例化Class2时,将字符串传递给构造函数,并且状态变量$ var1将被赋值。请记住,扩展一个类,您继承了它的所有属性和方法。

答案 2 :(得分:-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";

?>

输出:

  

Class1:test

     

Class2:test

     

Class1:prod

     

Class2:prod