php表示私有变量的是,PHP 访问私有和受保护的成员变量
示例
反射通常用作軟件測試的一部分,例如在運行時創建/實例化模擬對象。這對于在任何給定時間點檢查對象的狀態也非常有用。這是在單元測試中使用Reflection來驗證受保護的類成員是否包含期望值的示例。
下面是一個非常基礎的汽車課。它具有受保護的成員變量,該變量將包含代表汽車顏色的值。由于成員變量受保護,因此我們無法直接訪問它,而必須使用getter和setter方法分別檢索和設置其值。
class?Car
{
protected?$color
public?function?setColor($color)
{
$this->color?=?$color;
}
public?function?getColor($color)
{
return?$this->color;
}
}
為了測試這一點,許多開發人員將創建一個Car對象,使用設置汽車的顏色,使用檢索顏色,并將該值與他們設置的顏色進行比較:Car::setColor()Car::getColor()
/**
*?@test
*?@covers?????\Car::setColor
*/
public?function?testSetColor()
{
$color?=?'Red';
$car?=?new?\Car();
$car->setColor($color);
$getColor?=?$car->getColor();
$this->assertEquals($color,?$reflectionColor);
}
從表面上看,這似乎還可以。畢竟,所有要做的就是返回protected成員變量的值。但是此測試在兩個方面存在缺陷:Car::getColor()Car::$color它執行的測試不在此測試范圍內Car::getColor()
這取決于哪個錯誤本身可能使測試具有錯誤的肯定或否定。Car::getColor()
讓我們看看為什么不應該在單元測試中使用,而應該使用Reflection。假設開發人員被分配了一項任務,以向每種汽車顏色添加“金屬”。因此,他們嘗試修改,以在汽車的顏色前添加“金屬”:Car::getColor()Car::getColor()
class?Car
{
protected?$color
public?function?setColor($color)
{
$this->color?=?$color;
}
public?function?getColor($color)
{
return?"Metallic?";?$this->color;
}
}
看到錯誤了嗎?開發人員使用分號代替串聯運算符,以使“ Metallic”成為汽車的顏色。結果,無論汽車的實際顏色是什么,只要被調用,都會返回“ Metallic”。結果,即使工作得很好并且不受此更改的影響,我們的單元測試也將失敗。Car::getColor()Car::setColor()Car::setColor()
那么,如何驗證Car::$color包含通過設置的值?我們可以使用Refelection直接檢查受保護的成員變量。那么我們該怎么做呢?我們可以使用Refelection使受保護的成員變量可被我們的代碼訪問,以便它可以檢索值。Car::setColor()
讓我們先看一下代碼,然后將其分解:
/**
*?@test
*?@covers?????\Car::setColor
*/
public?function?testSetColor()
{
$color?=?'Red';
$car?=?new?\Car();
$car->setColor($color);
$reflectionOfCar?=?new?\ReflectionObject($car);
$protectedColor?=?$reflectionOfForm->getProperty('color');
$protectedColor->setAccessible(true);
$reflectionColor?=?$protectedColor->getValue($car);
$this->assertEquals($color,?$reflectionColor);
}
這是我們使用Reflection獲取Car::$color上面代碼中的value的方式:我們創建一個新的ReflectionObject代表我們的Car對象
我們得到一個ReflectionProperty用于Car::$color(此“代表”Car::$color變量)
我們使Car::$color無障礙
我們得到的價值 Car::$color
如您所見,通過使用Reflection,我們可以得到的價值,Car::$color而不必調用可能導致無效測試結果的任何訪問器函數。現在,我們的單元測試安全且準確。Car::getColor()Car::setColor()
總結
以上是生活随笔為你收集整理的php表示私有变量的是,PHP 访问私有和受保护的成员变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置:Ubuntu/Nginx/Mysq
- 下一篇: 文言文编程可以编译成PHP吗,阁下可知文