第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PHP:設(shè)置公共屬性時調(diào)用函數(shù)

PHP:設(shè)置公共屬性時調(diào)用函數(shù)

PHP
拉風的咖菲貓 2021-12-24 09:13:36
我有一個名為 reportPayment 的對象:class reportPayment extends JournalListElement {public $paymentType;public $paymentNum;public $paymentAmnt;public $accID;public $accDesc;function setPaymentAmnt($paymentAmnt) {    $this->paymentAmnt = MoneyHelper::centsToDollars($paymentAmnt);}function getPaymentAmnt() {    return $this->paymentAmnt;}}另一個類遍歷此對象的公共屬性以寫入 XML 文件;通過:foreach ($object as $key => $value) { }我的問題是我$paymentAmnt只需要通過這里的 setter 進行設(shè)置,以便centsToDollars()調(diào)用函數(shù)。這僅在我轉(zhuǎn)向$paymentAmnt私有屬性時才有效,這是我在遍歷對象屬性時無法承受的。簡而言之,我需要的是一種方法:確保centsToDollars()在設(shè)置時調(diào)用$paymentAmnt確保$paymentAmnt可以從外面看到編輯:現(xiàn)在可以按照 Michal 的回答將其設(shè)置為私有,并且仍然可以通過 getter 訪問該屬性。將它設(shè)置為私有意味著我無法迭代對象的屬性,但在這種情況下這對我來說非常重要。有沒有辦法在 Yii2/PHP 中做到這一點?
查看完整描述

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)過的屬性。


查看完整回答
反對 回復 2021-12-24
?
幕布斯6054654

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";

}


查看完整回答
反對 回復 2021-12-24
  • 2 回答
  • 0 關(guān)注
  • 250 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號