测试PHP静态成员变量产生的问题

实例一:

<?php

class A{

var $var='A::Var ';
public $public = 'A::Public ';
protected $protected = 'A::Protected ';
private $private = 'A::Private ';
function test(){
    echo $this->var;
    echo $this->public;
    echo $this->protected;
    echo $this->private;
}

}

class B extends A{

var $var='B::Var ';
public $public = 'B::Public ';
protected $protected = 'B::Protected ';
private $private = 'B::Private ';

}
$obj = new B();
$obj->test();
?>

图片描述

实例二:

<?php
class A{
    static $default="A::default ";
    public static $public="A::public ";
    protected static $protected="A::protected ";
    private static $private="A::private ";
    function test(){
        echo $this::$default;
        echo $this::$public;
        echo $this::$protected;
        //echo $this::$private;//error
    }
}

class B extends A{
    static $default="B::default ";
    public static $public="B::public ";
    protected static $protected="B::protected ";
    private static $private="B::private ";
}
$obj = new B;
$obj->test();
?>

图片描述
我问的是注释的那句为什么是错误的。

阅读 4k
5 个回答

private 属性只在本类中可以访问。

如果父类的方法中调用了私有属性,那么父类的方法只为父类的私有属性服务

请使用使用 static::$private

$this::$private 还有这种操作?我没见过啊。那我猜应该是和 self 是一样的吧。。

clipboard.png

这个应该说得很清楚了。

感谢大家的回答,但你们都认为我对访问控制不理解,给了我不想要的回答,所以我编写两个小例子,以示我对访问控制的理解。
实例一:
<?php
class A{

static $default="default ";
public static $public="public ";
protected static $protected="protected ";
private static $private="private ";
function test1(){
    echo A::$default;
    echo A::$public;
    echo A::$protected;
    echo A::$private;
}
function test2(){
    echo self::$default;
    echo self::$public;
    echo self::$protected;
    echo self::$private;
}
function test3(){
    echo $this::$default;
    echo $this::$public;
    echo $this::$protected;
    echo $this::$private;
}
function test4(){
    echo static::$default;
    echo static::$public;
    echo static::$protected;
    echo static::$private;
}

}
echo A::$default;
echo A::$public;
//echo A::$protected;//error
//echo A::$private;//error
$obj = new A;
echo $obj::$default;
echo $obj::$public;
//echo $obj::$protected;//error
//echo $obj::$private;//error
echo"<br/>";$obj->test1();
echo"<br/>";$obj->test2();
echo"<br/>";$obj->test3();
echo"<br/>";$obj->test4();
?>
实例二:继承
<?php
class A{

static $default="default ";
public static $public="public ";
protected static $protected="protected ";
private static $private="private ";

}

class B extends A{

function test1(){
    echo A::$default;
    echo A::$public;
    echo A::$protected;
    //echo A::$private;//error
}
function test2(){
    echo parent::$default;
    echo parent::$public;
    echo parent::$protected;
    //echo parent::$private;//error
}
function test3(){
    echo B::$default;
    echo B::$public;
    echo B::$protected;
    //echo B::$private;//error
}
function test4(){
    echo self::$default;
    echo self::$public;
    echo self::$protected;
    //echo self::$private;//error
}
function test5(){
    echo $this::$default;
    echo $this::$public;
    echo $this::$protected;
    //echo $this::$private;//error
}
function test6(){
    echo static::$default;
    echo static::$public;
    echo static::$protected;
    //echo static::$private;//error
}

}
echo B::$default;
echo B::$public;
//echo B::$protected;//error
//echo B::$private;//error
$obj = new B;
echo $obj::$default;
echo $obj::$public;
//echo $obj::$protected;//error
//echo $obj::$private;//error
echo"<br/>";$obj->test1();
echo"<br/>";$obj->test2();
echo"<br/>";$obj->test3();
echo"<br/>";$obj->test4();
echo"<br/>";$obj->test5();
echo"<br/>";$obj->test6();
?>

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题