我有以下类。我想要的是只定义一次,在主类(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 类:产品