[英]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.