2 回答

TA貢獻1777條經(jīng)驗 獲得超3個贊
一旦您將屬性聲明為公共屬性,您就無法限制對它的訪問,因此無法僅通過 setter 強制設(shè)置它。
但是在 Yii 中有一種方法可以讓財產(chǎn)看起來是公開的,即使它不是。
如果你的類JournalListElement繼承自 \yii\base\BaseObject(Yii 中的大多數(shù)類都繼承自 this)并且如果你將 setter 和 getter 聲明為 this
class ReportPayment extends JournalListElement
{
private $paymentAmnt;
public setPaymentAmnt($value)
{
...
}
public getPaymentAmnt()
{
...
}
}
然后您仍然可以paymentAmnt像這樣訪問該屬性,就像它是公開的一樣:
$report = new ReportPayment();
$report->paymentAmnt = 20;
echo $report->paymentAmnt;
那是因為\yii\base\BaseObject里面有__set和__get魔法方法的實現(xiàn)。當您嘗試訪問無法訪問的屬性時,這些方法將調(diào)用setPropertyName()或者getPropertyName()是否存在此類方法。
如果屬性是,private您仍將直接從 ReportPayment 類中訪問它。您將通過 getter/setter 從類外部或從擴展 ReportPayment 的類自動訪問它。
如果屬性是,protected您將直接從 ReportPayment 和擴展它的所有類中訪問它。您將通過來自 ReportPayment 類或其子類之外的 getter/setter 訪問它。
在純 php 中,您可以通過自己實現(xiàn)__set和__get方法來獲得類似的結(jié)果。
迭代屬性
您可以使用 ReflectionClass 來獲取所有屬性的列表(包括私有屬性),但我不建議這樣做。使用這種方式違背了OOP的原則,以后可能會出現(xiàn)問題。例如在您需要添加更多私有屬性的情況下。在這種情況下,您將不得不編輯所有 foreach 循環(huán)以跳過新屬性。
可能的更好方法:
1) 返回可見屬性數(shù)組的方法:
class ReportPayment extends JournalListElement
{
... code declaring properties and getters/setters
public function getProperties()
{
return ['paymentType', 'paymentNum', 'paymentAmnt', ...];
}
}
foreach ($object->getProperties() as $prop) {
echo $object->$prop;
}
2) 將屬性轉(zhuǎn)換為數(shù)組的方法
class ReportPayment extends JournalListElement
{
... code declaring properties and getters/setters
public function asArray()
{
return [
'paymentType' => $this->paymentType,
'paymentNum' => $this->paymentNum,
'paymentAmnt' => $this->paymentAmnt,
...
];
}
}
foreach ($object->asArray() as $prop => $value) {
echo $prop . ": " . $value;
}
3) 實現(xiàn)Iterator接口。您可以在此處找到更多詳細信息。自己的Iterator接口實現(xiàn)允許您控制 foreach 通過哪些鍵/值。
這些方法的最大優(yōu)點是類本身仍然控制循環(huán)經(jīng)過的屬性。

TA貢獻1876條經(jīng)驗 獲得超7個贊
通過反射,您可以遍歷對象屬性,即使它們是私有的:
$reflect = new ReflectionClass($reportPaymentObject);
$props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE);
foreach ($props as $prop) {
print $prop->getName() . "\n";
}
- 2 回答
- 0 關(guān)注
- 250 瀏覽
添加回答
舉報