• [学习] php 类


    php 类

    PHP面向对象中new self( )和 new static( ) 的区别

    • 被定义为公有(public)的类成员可以在任何地方被访问(类的内部,包过父类,子类,自己;还可以通过类的实例对象访问)。
    • 被定义为受保护(protected)的类成员则可以被其自身以及其子类和父类访问,不能通过类的实例对象访问。
    • 被定义为私有(private)的类成员则只能被其定义所在的类访问,不能通过类的实例对象访问。

    默认都是public。

    子类默认继承父类所有的 public 和 protected 方法,但不继承 private 方法和属性。

    双冒号(::)是范围解析操作符,用于访问类的静态成员类常量

    双冒号只能访问静态属性,不能访问非静态的其他属性(public、private、protected)。但是双冒号可以调用非静态方法(包括public、protected、private)。

    // php 版本5.6.9
    class B {
        static $name = "b";
        public $er = "er";
        function testFnc() {
            echo self::aa()."
    ";
            echo self::bb()."
    ";
            echo self::c()."
    ";
        }
        function aa() {
            echo "public aa function 
    ";
        }
        protected function bb() {
            echo "protected bb function 
    ";
        }
        private function c() {
            echo "private c function 
    ";
        }
    }
    
    $b = new B();
    $b->testFnc();
    

    static 关键字

    static关键字声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

    $this在静态方法中不可用。

    // php 版本5.6.9
    class Test {
        static $name = "ghj";
        public static function tt() {
            echo "static function tt 
    ";
        }
    }
    
    $t = new Test();
    $t->tt(); // static function tt
    $t->name; // 报错
    echo Test::$name; // ghj
    

    函数里的静态变量

    在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。

    静态变量只在局部的作用域中存在,离开这个作用域也不会丢失,当然也不能再次初始化。

    // php 版本5.6.9
    function test() {
       static $a = 1; // 只在第一次调用test()函数时执行这一句,之后每次调用都会以上次调用后$a的值作为初始值
       echo $a;
       $a++; 
    }
    
    test(); // 第一次调用 打印 1
    test(); // 第二次调用 打印 2
    

    后期静态绑定 static::

    static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于静态方法的调用以及静态属性的访问。

    // php 版本5.6.9
    class Test {
        static $name = "ppp";
        static function getName() {
            return static::$name;
        }
    
        function tt() {
            echo '$name -- '.static::getName()."
    ";
            echo 'static::$name -- '.static::$name."
    ";
        }
    }
    
    class Fast extends Test {
        static $name = "Fast";
    }
    
    $t = new Test();
    $t->tt(); // static解析为Test  ppp
    
    $f = new Fast();
    $f->tt(); // static解析为Fast  Fast
    

    self与static的区别

    比如在函数中:

    • self是静态函数(静态属性)声明所在的类
    • static是调用静态函数(访问静态属性)的那个类

    例子:

    // php 版本5.6.9
    class A {
        static $name = 'a';
        function test() {
            echo self::$name."
    ";
            echo static::$name."
    ";
        }
    }
    
    class B extends A {
        static $name = "b";
    }
    
    $a = new A();
    $b = new B();
    $a->test(); // a a
    
    $b->test();// a b
    
  • 相关阅读:
    深入学习图数据库语言Gremlin 系列文章链接汇总
    HugeGraph入门
    Connection 'ens33' is not available on device ens33 because device is strictly unmanaged
    正则里的\s和s有什么区别?
    LXMERT: Learning Cross-Modality Encoder Representations from Transformers
    Pixel-BERT: Aligning Image Pixels with Text by Deep Multi-Modal Transformers
    在vue中使用jsx语法
    JavaScript数据结构和算法
    如何用智能手机或PAD观看笔记本电脑的视频?
    linux shell和windows bat编写
  • 原文地址:https://www.cnblogs.com/fogwind/p/15194449.html
Copyright © 2020-2023  润新知