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()