测试了一下,会报以下错误,但将会照常执行 Strict Standards: Non-static method a::hello() should not be called statically 测试代码 <?php class a { public function __construct() { echo 'ok1'; } public function hello() { echo 'Ok2'; } } a::hello(); echo 'ok3'; ?>除去报错,运行结果 Ok2Ok3 。 我的猜测是发生这种错误后,编译器会先把hello()转成静态方法,至少没有先实例化a类。 好吧,这个现象真的很纠结,手册上也没讲这是嘛情况
其实楼主的代码这种,属于工厂模式。 现在还无需介意什么是工厂模式,等你学完了PHP,开发过几个网站,你自然会开始介入 设计模式这一大块,而工厂模式就是其中之一。所谓工厂模式一般是指用静态类实现程序逻辑的运作。而楼主所问的就是静态类。举个简单的例题: class test{ public static $obj; //静态成员属性 public static function run(){ self::$obj = 1; //静态方法里调用其他静态成员属性,请用self:: 这种形式而非 $this-> }class test2 extends test{ //继承于test类 public static function run(){ //静态类是没有构造函数的,所以用php4的这种方式来重写test类的run()
class test{ public static $obj; //静态成员属性 public static function run(){ self::$obj = 1; //静态方法里调用其他静态成员属性,请用self:: 这种形式而非 $this-> }class test2 extends test{ //继承于test类 public static function run(){ //静态类是没有构造函数的,所以用php4的这种方式来重写test类的run()
如果fun1()不是静态方法,那就将出错。
S_Obj = new S; S::fun1(); 也会出错
详情请看php.net静态方法说明
上面那种调用方法,函数fun1是静态化后快还是不静态化的速度快?
你可以去试下,fun1()不申明静态函数 直接 S::fun1() 是不会报错的,难道是我这里环境的问题?
Strict Standards: Non-static method a::hello() should not be called statically
测试代码
<?php
class a
{
public function __construct()
{
echo 'ok1';
}
public function hello()
{
echo 'Ok2';
}
}
a::hello();
echo 'ok3';
?>除去报错,运行结果 Ok2Ok3 。
我的猜测是发生这种错误后,编译器会先把hello()转成静态方法,至少没有先实例化a类。 好吧,这个现象真的很纠结,手册上也没讲这是嘛情况
按理说应该不能这么调用的(不知道记错了没,java好像就不能这么调用),所以我很纠结呀.......
大牛们,快出现............
如E_ALL &~E_NOTICE
你可以设置自己的错误提示级别
程序里面没有设置。
error_reporting(E_STRICT);
关键是这种写法应该有错,不过phpwind全是这种写法,全是没实例化直接::调用的方法,以后的php还支持这种写法不......
http://zhwq.sinaapp.com/?p=66
http://www.rainsts.net/article.asp?id=261
http://www.foolbirds.com/php%E4%B8%AD%E9%9D%99%E6%80%81%E8%B0%83%E7%94%A8%E9%9D%9E%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95.html/comment-page-1#comment-6239
如果没有,那么直接调用函数是不行的,必须先实例化一个该对象,然后通过实例化的对象调用。
现在还无需介意什么是工厂模式,等你学完了PHP,开发过几个网站,你自然会开始介入 设计模式这一大块,而工厂模式就是其中之一。所谓工厂模式一般是指用静态类实现程序逻辑的运作。而楼主所问的就是静态类。举个简单的例题:
class test{ public static $obj; //静态成员属性
public static function run(){
self::$obj = 1; //静态方法里调用其他静态成员属性,请用self:: 这种形式而非 $this->
}class test2 extends test{ //继承于test类
public static function run(){ //静态类是没有构造函数的,所以用php4的这种方式来重写test类的run()
parent::run(); //我发现我还是需要父类test的run() 因为它改变了$obj的值
echo self::$obj; //获得1,而不是空
}public static function abc(){
echo '123';
}
}
}test2::run();
test2::abc();
//这种调用方式是不是特别爽?讨厌看到-> 吗?
而为什么别人要用静态类实现工厂模式?因为静态类的开发效率高,执行速度快!静态类比类快近3倍的速度,而且开发过程也接近于过程开发。(类是面向对象的)
public static function run(){
self::$obj = 1; //静态方法里调用其他静态成员属性,请用self:: 这种形式而非 $this->
}class test2 extends test{ //继承于test类
public static function run(){ //静态类是没有构造函数的,所以用php4的这种方式来重写test类的run()
parent::run(); //我发现我还是需要父类test的run() 因为它改变了$obj的值
echo self::$obj; //获得1,而不是空
}public static function abc(){
echo self::$obj;
}
}
test2::abc();你也可以试试这份代码,只执行了abc()
但是我说的是php中::可以直接调用非静态类函数,这个在其他变成语言中是不允许的。不知道php官方有没有相关的解释
我在phpwind论坛上问这个问题的时候好像说的php4不支持静态(不知道是不是,有没有人来解答哈),不知道是不是这个原因导致php升级为了兼容老版本保留的这个在php来说不是错误的错误