zoukankan      html  css  js  c++  java
  • 关于PHP静态方法调用和实例化类调用的区别

    1.首先来澄清一些观点

      由于静态方法在内存中只有一份,无论你调用多少次,都是共用的,而且没有对象的概念,所以不能在静态方法里面使用$this调用,如果非得调用的话,只能实例化自身类

      而实例化不一样,每一个实例化是一个对象,在内存中是多个的

    <?php
    Error_reporting(E_ALL|E_STRICT);
    
    class A{
        
        public function bar(){
            echo 'bar'.PHP_EOL;
        }
        public static function foo(){
            echo 'foo'.PHP_EOL;
        }
    }
    
    A::bar();//会报错
    A::foo();//正确
    $obj = new A();
    $obj -> foo();//正确
    /* 
      bar()是一个非静态方法,应该由对象来调用,但用静态来调用此方法也可以执行,而严格状态下,此方法会执行,同时报错,
      Strict Standards: Non-static method Human::easyeat() should not be called statically in........
      但是实例化的类是可以调用静态方法的。
    */
    <?php
    
    class A{
        public $name = 'zongshuai';
    
        public function bar(){
            echo 'bar'.PHP_EOL;
        }
        public static function foo(){
            echo self::$name.PHP_EOL;//报错
        }
    }
    
    A::foo();
    
    /*
        静态方法不能调用非静态属性 。不能使用self::调用非静态属性。
    */
    总结: 
    类》访问->静态方法(类的方法)->可以
    类》访问->普通方法(对象的方法)->不可以(虽然方法里不用$this关键字时,可以!但不支持这种写法)
    对象》访问》静态方法(类的方法)->可以
    对象》访问》普通方法(对象的方法)->可以
  • 相关阅读:
    java设计模式演示样例
    一步一步写算法(之排序二叉树)
    收集经常使用的.net开源项目
    jdbc连接数据库
    Android开发系列(二十二):AdapterViewFlipper的功能和使用方法
    ProgressDialog使用总结
    HDU 4916 树分治
    [Unity3D]自制UnityForAndroid二维码扫描插件
    IOS ARC和非ARC文件混用
    让子弹飞Demo版
  • 原文地址:https://www.cnblogs.com/xiaozong/p/5728790.html
Copyright © 2011-2022 走看看