作者PsMonkey (痞子軍團團長)
看板PHP
標題Re: [請益] Method直接用Static呼叫的問題
時間Thu Jul 18 10:55:37 2013
我先假設 PHP 對 static 的定義跟 Java 完全一樣
(版主可以因此直接砍掉這篇,我不會有怨言的 [逃])
※ 引述《tails32100 (Tails)》之銘言:
: 小弟這問題一年前就有了
: 原文:
: https://disp.cc/b/tails#!546-3zvE
: 剛剛把程式碼再拿出來試
: 發現出現錯誤
: Strict standards: Non-static method A::testA() should not be called statically
: , assuming $this from incompatible context in BALABALA
: 然後上網google一下錯誤,這好像是error_reporting的等級有包括E_STRICT
: 可是好像網路有些framework都有用到這個寫法 (CakePHP、XOOPS)
: 小弟的問題是:
: 這個寫法是建議不要用,還是可以用?
static 的 method 要用不 static 的方法呼叫
這不太好,但通常會被接受
非 static 的 method 用 static 的方法呼叫
喵的,PHP 還能讓你執行真是有點莫名其妙 [無誤]
還是看一下 [php.net] 對 static 的解說
[php.net]:
http://php.net/manual/en/language.oop5.static.php
Declaring class properties or methods as static
makes them accessible without needing an instantiation of the class.
A property declared as static can not be accessed with an
instantiated class object (though a static method can).
用擬人化一點的講法,以 static 修飾的東西(method/field 均可)
他是超然「物」外的
(謎之聲:X你X的完全沒有比較好懂 [毆])
他跟你有沒有 new 出那個 instance 沒有關係
你就算是 new 出 100 個 instance
那個 static 修飾的東西還是只有一個
當然,不可否認的,這樣子惡搞很多時候很好用 [遮臉]
//也許不能這樣用,我沒有實際測試過 [逃]
class Foo {
private static $counter = 0;
private $id;
public function Foo() {
Foo::$counter++;
$this->id = Foo::$counter;
}
public funtion getId() { return $this->id; }
}
但這樣的惡搞,其實還是凸顯了 $counter 超然於 Foo 以外
你可以想成,$counter 放在 Foo 底下只是為了方便呼叫 & 管理而已
所以在 static 的 method 當中,因為根本沒有 instance
所以也就根本不可能知道什麼叫驚喜... 我是說 $this
如果能讓我大放厥詞的話
我會說(過去某版?)PHP 炸 error 的點太奇怪了
怎麼會用 static 的方式叫用非 static 的 method 還可以過
噴的 error 反而是 $this 找不到.......
(沒用到 $this 的人就會一直以為這樣可以用.... [抖])
====
然後剛剛看報紙 (X) php.net (O) 才知道
PHP 的 static field,限制還蠻大的...... Orz
果然我的智商低到只能乖乖寫 Java 嗎? [淚目]
--
錢鍾書:
說出來的話
http://www.psmonkey.org
比不上不說出來的話
Java 版 cookcomic 版
只影射著說不出來的話
and more......
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.25.5.37
推 rickysu:基本上PHP是一個很"友善"的語言,他會盡力去指正你的錯誤 07/18 11:02
→ rickysu:但是他不會阻止你幹"蠢事"。 07/18 11:04
→ rickysu:這沒什麼對錯,只是語言設計哲學的不同。 07/18 11:04
→ PsMonkey:因為我太蠢了,所以希望語言可以阻止我阿 [淚目] 07/18 11:05
→ rickysu:除非你已經踩到他的底限例如從外部呼叫 private...XD 07/18 11:06
推 tails32100:推猴大您超認真Orz 07/18 11:38
→ tails32100:不過小弟是說 非static method 用static呼叫是可行 07/18 11:40
→ tails32100:不過會報 Strict 等級的錯誤 07/18 11:40
→ tails32100:欸 小弟好像眼花看錯了 sorry 07/18 11:42
推 tkdmaf:曾經聽說PHP6打算採用嚴謹的架構,但目前還不知道狀況。 07/18 11:52
→ chaoms:-.- PHP預設是為了相容古早長久累積的程式 07/18 15:54
→ chaoms:想要嚴謹一點也可以自己打造成那樣的環境! 07/18 15:55
推 a60301:推猴大用心,真的PHP會接受任何可能執行的程式碼,真的走不 07/18 18:14
→ a60301:下去的時候才會噴 error 07/18 18:14