zoukankan      html  css  js  c++  java
  • 关于PHP面向对象 静态方法的疑问

    <?php
    
    class Base {
    
        public function foo() {
            echo __CLASS__.'---foo';
        }
    }
    
    class Bar extends Base {
       
        public function foo() {
            echo __CLASS__.'---foo';
        }
    
        public function foo1() {
            echo __CLASS__.'---foo1';
        }
    
        public static function test() {
            call_user_func_array(['static','foo'],[]);
        }
    }
    
    //Bar::test();
    
    
    $class=new ReflectionClass('Bar');
    
    
    //print_r($class->getMethods());
    /*foreach ($class->getProperties() as $property) {
        
        var_dump($property);
        
    }*/
    Bar::foo();
    foreach($class->getMethods(ReflectionMethod::IS_STATIC ) as $method) {
        var_dump($method);
    }
    /*oobject(ReflectionMethod)#2 (2) {
      ["name"]=>
      string(4) "test"
      ["class"]=>
      string(3) "Bar"
    } */

    这边的疑问是  只有test方法声明了static  但是为什么Bar::foo()还是可以调用    但是反射里  是静态方法的只有一个test  到处搜了下也没有标准答案。
    可能就是PHP内部转换成了静态方法。用下面的一个人的一句话来描述吧:

    php自动转化为静态方法,不用你去new对象而开辟新的内存地址,直接就可以使用该类的方法,该方法也将作为该类的一个成员属性而存在,不因为new对象而占用单独的内存。
    既然这样,可能带来的隐患是:如果将变量$name的static去掉便会报错。方法里面的属性必须也都是静态的才能调用。还有就是这个对不是静态的属性是无法调用到的,比如去掉$name的static后,MyPc::$name是不行的。
    好处当然也显而易见,能够自动转化为静态方法也就减少了内存的损耗。
  • 相关阅读:
    Blender 3DOne
    [翻译]XNA外文博客文章精选之sixteen(中)
    实习技术员的基本功(二)
    [翻译]XNA外文博客文章精选之fifteen
    实习技术员的基本功(三)
    [翻译]XNA外文博客文章精选之sixteen(下)
    实习技术员的基本功(一)
    [翻译]XNA外文博客文章精选之sixteen(上)
    思维导图
    MySQL error 1045(28000): Access denied for user ...
  • 原文地址:https://www.cnblogs.com/tudou1223/p/9156979.html
Copyright © 2011-2022 走看看