作者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
1F:推 rickysu:基本上PHP是一个很"友善"的语言,他会尽力去指正你的错误 07/18 11:02
2F:→ rickysu:但是他不会阻止你干"蠢事"。 07/18 11:04
3F:→ rickysu:这没什麽对错,只是语言设计哲学的不同。 07/18 11:04
4F:→ PsMonkey:因为我太蠢了,所以希望语言可以阻止我阿 [泪目] 07/18 11:05
5F:→ rickysu:除非你已经踩到他的底限例如从外部呼叫 private...XD 07/18 11:06
6F:推 tails32100:推猴大您超认真Orz 07/18 11:38
7F:→ tails32100:不过小弟是说 非static method 用static呼叫是可行 07/18 11:40
8F:→ tails32100:不过会报 Strict 等级的错误 07/18 11:40
9F:→ tails32100:欸 小弟好像眼花看错了 sorry 07/18 11:42
10F:推 tkdmaf:曾经听说PHP6打算采用严谨的架构,但目前还不知道状况。 07/18 11:52
11F:→ chaoms:-.- PHP预设是为了相容古早长久累积的程式 07/18 15:54
12F:→ chaoms:想要严谨一点也可以自己打造成那样的环境! 07/18 15:55
13F:推 a60301:推猴大用心,真的PHP会接受任何可能执行的程式码,真的走不 07/18 18:14
14F:→ a60301:下去的时候才会喷 error 07/18 18:14