zoukankan      html  css  js  c++  java
  • PHP中静态(static)调用非静态方法详解--调用!!!

    来源:https://www.cnblogs.com/yolo-bean/p/7739265.html

    这里分析了php面向对象中static静态属性和静态方法的调用。关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了。静态属性、方法(包括静态与非静态)在内存中,只有一个位置(而非静态属性,有多少实例化对象,就有多少个属性)。

    <?php 
    header("content-type:text/html;charset=utf-8"); 
    class  Human{ 
     static public $name  = "小妹"; 
     public $height = 180; 
     static public function tell(){ 
     echo self::$name;//静态方法调用静态属性,使用self关键词 
     //echo $this->height;//错。静态方法不能调用非静态属性 
    //因为 $this代表实例化对象,而这里是类,不知道 $this 代表哪个对象                                                                                     
     } 
     public function say(){ 
     echo self::$name  . "我说话了"; 
     //普通方法调用静态属性,同样使用self关键词 
     echo $this->height; 
     } 
    } 
    $p1  = new Human(); 
    $p1->say();  
    $p1->tell();//对象可以访问静态方法 
    echo  $p1::$name;//对象访问静态属性。不能这么访问$p1->name 
    //因为静态属性的内存位置不在对象里 
    Human::say();//错。say()方法有$this时出错;没有$this时能出结果 
    //但php5.4以上会提示 
    ?>

    结论:

    1、静态属性的调用,用self:: ,无论是静态或非静态方法都可以调用静态属性;

    2、静态方法可以调用非静态方法,使用 self 关键词。php里,一个方法被self:: 后,它就自动转变为静态方法;

    3、静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里;

    在tp5框架里面,只能调用静态的,如果强制用self调用非静态的方法是会报错的。

    想要在静态方法里面调用本类的方法的话,只能new出来一个实例,然后调用。静态方法中不能引用非静态方法——理由很简单,因为静态方法直接可以不经过实例化就可以使用。但是非静态方法必须借助一个实例才能使用。静态方法中用非静态变量,那么这变量“没有实例化”就不能被直接使用的。矛盾。

  • 相关阅读:
    List of the best open source software applications
    Owin对Asp.net Web的扩展
    NSwag给api加上说明
    'workspace' in VS Code
    unable to find valid certification path to requested target
    JMeter的下载以及安装使用
    exception disappear when forgot to await an async method
    Filter execute order in asp.net web api
    记录web api的request以及response(即写log)
    asp.net web api的源码
  • 原文地址:https://www.cnblogs.com/laijinquan/p/9088839.html
Copyright © 2011-2022 走看看