簡體   English   中英

PHP # 通過參考或錯誤訪問 class 的受保護或私有變量?

[英]PHP # Accessing protected or private Variables of class by reference intended or a bug?

解釋

在研究時,我在下面創建了這個小代碼片段,以更好地了解 php。 我現在提出這個問題的原因是為了接觸更有經驗的開發人員,以免過多地阻塞系統,也不要把這個問題推得更遠。

下面是關於如何訪問 scope 和 class 之外的私有或受保護變量的代碼示例。


代碼示例

此代碼示例將$TestVar設置為對test class 內部的私有變量test::A的引用。

<?php
class 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 Value
var_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);

預期 Output:

int 123
int 321
int 777

object(Test)[1]
  private 'A' => int 777

結果

我將其視為錯誤的原因,手冊在描述和示例中都指出:

聲明為 protected 的成員只能在 class 本身內以及通過繼承類和父類訪問。

聲明為私有的成員只能由定義該成員的 class 訪問。

因為這是不可能的或不打算的。

這是一個錯誤,一個錯誤的文檔,還是一個必須忍受的錯誤。

這種行為是完全正常的。 實際上,如果您的屬性是對象(始終通過引用傳遞),您甚至不需要顯式創建引用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM