为了账号安全,请及时绑定邮箱和手机立即绑定

PHP # 通过引用访问类的受保护或私有变量是有意还是错误?

PHP # 通过引用访问类的受保护或私有变量是有意还是错误?

PHP
函数式编程 2023-10-21 16:11:39
解释在研究过程中,我创建了下面这个小代码片段,以更好地了解 php。我现在创建这个问题的原因是为了接触更有经验的开发人员,以免过多地阻塞系统,并且不要让系统变得更进一步。下面是有关如何访问类范围之外的私有或受保护变量的代码示例。代码示例此代码示例将设置为对类内部$TestVar私有变量的引用。test::Atest<?phpclass Test {    private $A = 123;        public function changeA ($Var){        $this->A = $Var;    }        public function createReference(){        return([&$this->A]);    }}$TestClass = new Test();$TestVar = &$TestClass->createReference()[0];通过使用Test::changeA()或改变$TestVar的内容test::A可以被改变。//Test Current Valuevar_dump($TestVar);//Change test::A the intended way$TestClass->changeA(321);var_dump($TestVar);//Change it by reference$TestVar = 777;var_dump($TestVar);var_dump($TestClass);预期输出:int 123int 321int 777object(Test)[1]  private 'A' => int 777结果为什么我认为这是一个错误,手册在描述和示例中都指出:声明为 protected 的成员只能在类本身内部以及通过继承类和父类访问。声明为私有的成员只能由定义该成员的类访问。这是不可能的或有意的。这是一个错误、一个错误的文档还是只是一个必须忍受的错误。
查看完整描述

1 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

这种行为是完全正常的。事实上,如果您的属性是对象(始终通过引用传递),您甚至不需要显式创建引用:


class Foo

{

    private Datetime $when;


    public function __construct()

    {

        $this->when = new DateTime('1950-12-31');

    }


    public function getWhen(): DateTime

    {

        return $this->when;

    }

}


$f = new Foo();

$w = $f->getWhen();

$w->modify('+50 years');

var_dump($w, $f);

object(DateTime)#2 (3) {

  ["date"]=>

  string(26) "2000-12-31 00:00:00.000000"

  ["timezone_type"]=>

  int(3)

  ["timezone"]=>

  string(13) "Europe/Madrid"

}

object(Foo)#1 (1) {

  ["when":"Foo":private]=>

  object(DateTime)#2 (3) {

    ["date"]=>

    string(26) "2000-12-31 00:00:00.000000"

    ["timezone_type"]=>

    int(3)

    ["timezone"]=>

    string(13) "Europe/Madrid"

  }

}

这与您引用的文档并不矛盾。该属性本身无法访问:


$f->when;

// PHP Fatal error:  Uncaught Error: Cannot access private property Foo::$when

参考文献是一种不同的语言功能。也许通过另一个例子更容易理解:


function a(){

    $local_variable = 1;

    b($local_variable);

    echo "b modified a's local variable: $local_variable\n";

}


function b(&$number)

{

    echo "b can read a's local variable: $number\n";

    $number++;

}


a();

b can read a's local variable: 1

b modified a's local variable: 2


查看完整回答
反对 回复 2023-10-21
  • 1 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信