中途转的php,基础知识不够强,
最近在看phpwind的时候,遇到这种类函数的调用
S::fun1();
.........
类S未实例化,fun1写成静态函数和直接定义(不用static申明)有没有区别?

解决方案 »

  1.   

    fun1()只能声明为 static ,且需要是public。 这样S::fun1() 就是调用S类的fun1()静态方法,无需实例化。
    如果fun1()不是静态方法,那就将出错。 
    S_Obj = new S;   S::fun1();  也会出错
    详情请看php.net静态方法说明
      

  2.   


    上面那种调用方法,函数fun1是静态化后快还是不静态化的速度快?
      

  3.   


    你可以去试下,fun1()不申明静态函数  直接  S::fun1()  是不会报错的,难道是我这里环境的问题?
      

  4.   

    测试了一下,会报以下错误,但将会照常执行
    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类。 好吧,这个现象真的很纠结,手册上也没讲这是嘛情况
      

  5.   

    我这里不会报任何错误,你php环境是多少的哦,或者说我哪里设置的问题
    按理说应该不能这么调用的(不知道记错了没,java好像就不能这么调用),所以我很纠结呀.......
    大牛们,快出现............
      

  6.   

    这种错误不是致命错误,可以执行但是会有警告,至于你的为什么没有警告输出,是因为错误的类别设置不一样。
    如E_ALL &~E_NOTICE
    你可以设置自己的错误提示级别
      

  7.   

    php.ini  里面error_reporting = E_ALL 
    程序里面没有设置。
      

  8.   

    这个错误需要开启E_STRICT才会显示。
    error_reporting(E_STRICT);
      

  9.   

    这种写法会不会影响到php的效率,
    关键是这种写法应该有错,不过phpwind全是这种写法,全是没实例化直接::调用的方法,以后的php还支持这种写法不......
      

  10.   

    找到几篇文章,强烈建议用正规的写法,要么实例化,要么加static关键字
    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
      

  11.   

    如果类中声明的该成员函数有static修饰符,那么该函数是静态函数,可以通过::直接调用,不需要实例化的对象调用。
    如果没有,那么直接调用函数是不行的,必须先实例化一个该对象,然后通过实例化的对象调用。
      

  12.   

    曾经我注意过这一点,php中的方法不用加static关键字,也可以使用作用域解析符号来调用。这个在c++里面是会报错的。没试过之前我一直不相信。至于php底层是怎么处理的,只能去源码中挖掘了。不过建议如果需要定义一个静态方法,还是给他加上static关键字吧。
      

  13.   

    phpwind的代码写的问题多了去了,早期的中国开源程序都有无数不规范的地方,不过随着时间的推移,我们技术人员水平的进步,以及对产品的质量越来越重视。这种情况已经有明显改善了。dz的代码现在就比几年前提升了多个档次。
      

  14.   

    其实楼主的代码这种,属于工厂模式。
    现在还无需介意什么是工厂模式,等你学完了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倍的速度,而且开发过程也接近于过程开发。(类是面向对象的)
      

  15.   

    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 self::$obj;
    }
    }
    test2::abc();你也可以试试这份代码,只执行了abc()
      

  16.   

    单例模式工厂模式其实都和这个问题没关系的,你看你写的代码都用static标记了的,这种写法不管在那个语言来说是对的
    但是我说的是php中::可以直接调用非静态类函数,这个在其他变成语言中是不允许的。不知道php官方有没有相关的解释
    我在phpwind论坛上问这个问题的时候好像说的php4不支持静态(不知道是不是,有没有人来解答哈),不知道是不是这个原因导致php升级为了兼容老版本保留的这个在php来说不是错误的错误