我在聽XX視頻課程,遇到__set()魔術方法,不能使用的問題

來源:互聯網
上載者:User
 class study{     private  $name;     private  $age;     function say(){     echo "我的名字是:".$this->name.",我的年齡是:".$this->age ;     }      function __set($k,$v){              echo "1111"; } }$lisi=new study();$lisi->age=100;

我按老師視頻裡書寫的,視頻裡老師的zend沒有報錯,而我的報錯了,說age是私人屬性....,難道因為視頻是11年的所以,如今變化很大?還是需要什麼設定?我發現我按老師說的很多魔術方法都會使用時報錯,很苦惱~求助!!

回複內容:

 class study{     private  $name;     private  $age;     function say(){     echo "我的名字是:".$this->name.",我的年齡是:".$this->age ;     }      function __set($k,$v){              echo "1111"; } }$lisi=new study();$lisi->age=100;

我按老師視頻裡書寫的,視頻裡老師的zend沒有報錯,而我的報錯了,說age是私人屬性....,難道因為視頻是11年的所以,如今變化很大?還是需要什麼設定?我發現我按老師說的很多魔術方法都會使用時報錯,很苦惱~求助!!

樓主的調用沒有錯啊。

假設有一個類,類中有一個私人變數$name

name = '文藝青年阿虛V';

按照常理物件導向是不允許你這樣調用的

$obj->name = '文藝青年阿虛V';

PHP中__set的功能就是讓你可以這麼做,具體的流程是這樣的,當PHP解析器看到你正在使用對象調用一個私人變數,這時它本想著報錯呢,可是又發現你的類中有一個__set()方法,於是它就不報錯,而自動執行__set()方法了

上面的__set()方法其實很簡陋,只echo "here";了,既然它在上面所說的這種情況下自動調用,那我就可以在這種情況下完善一下__set()方法,讓它去做你想乾的事。

根據你的say()方法,我猜是你的__set方法內缺了一行
$this->$k = $v;
如果仍然有問題,確認你的php版本,__set方法是php5中有的,你不會找了一個很古老的4.x的版本吧?

然後作為屬性重載方法,必須把方法的存取控制聲明為public,如果你的視頻教程沒有提到這點,那麼是一個非常不嚴謹的教程,我建議你趕緊換。見: http://php.net/manual/zh/language.oop5.overloading.php 當然了,由於php為了向下相容,所以即使你不寫public的存取控制,它預設也會聲明稱public,然而這是一個不可依賴的特性,你不知道未來PHP是否還會相容這種寫法

?太徹了 private是私人屬性 只能在類裡面調用

你寫的沒錯啊,就是因為age是私人屬性才會有__set()__get()

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.