首页 后端开发 php教程 PHP中如何形成static::与new static()的静态绑定

PHP中如何形成static::与new static()的静态绑定

Jun 06, 2020 pm 03:20 PM
静态绑定

PHP中如何形成static::与new static()的静态绑定

PHP中static::与new static()之后期静态绑定

一、parent、self、$this、__CLASS__

class A {}
class B extends A{
parent::(public|protected)(静态方法|静态变量)  ===> parent永远是A
self::(public|protected)(静态方法|静态变量)  ===> self永远是B
$this->(public|protected)(非静态方法|非静态变量)  ===> $this永远是B的是实例化对象
__CLASS__    ===> 永远是B
} 
class C extends B{
parent::(public|protected)(静态方法|静态变量)  ===> parent永远是B
self::(public|protected)(静态方法|静态变量)  ===> self永远是C
$this->(public|protected)(非静态方法|非静态变量)  ===> $this永远是C的是实例化对象
__CLASS__    ===> 永远是C 
}
登录后复制

二、static::

static关键字可以实现以下功能:

1 调用类的静态方法 有后期静态绑定效果;

2 调用类的静态属性 有后期静态绑定效果;

3 调用类的非静态方法 没有后期静态绑定效果;

4 注意:不可以调用非静态属性;

class A {
    private static function foo() {
        echo "A success!\n";
    }
    public function test() {
         $this->foo();
    }
}
 
class B extends A {
}
 
class C extends A {
    private static function foo() {
    echo "C success!\n";
    }
}
 
$b = new B();
$b->test();//A success!
$c = new C();
$c->test();//A success!
登录后复制
class A {
    private static function foo() {
        echo "A success!\n";
    }
    public function test() {
        static::foo();
    }
}
 
class B extends A {
}
 
class C extends A {
    private static function foo() {
    echo "C success!\n";
    }
}
 
$b = new B();
$b->test();//A success!
$c = new C();
$c->test();//A无法调用C里的私有foo方法 
 
 
 
 
//将C的foo改成非private(public|protected)就可以解决
class A {
    private static function foo() {
        echo "A success!\n";
    }
    public function test() {
        static::foo();
    }
}
 
class B extends A {
}
 
class C extends A {
    public static function foo() {
    echo "C success!\n";
    }
}
 
$b = new B();
$b->test();//A success!
$c = new C();
$c->test();//C success!
登录后复制
class A {
 public static function foo() {
     static::who();
 }
 
 public static function who() {
     echo __CLASS__."\n";
 }
}
 
class B extends A {
 public static function test() {
     A::foo();
     parent::foo();
     self::foo();
 }
 
 public static function who() {
     echo __CLASS__."\n";
 }
}
class C extends B {
 public static function who() {
     echo __CLASS__."\n";
 } 
}
 
C::test(); 
A =>A::foo()的结果
C =>parent::foo()能走到A的foo,里面static::who找C::who
C =>self::foo()能走到B的foo,B继承A,走到A的foo,里面static::who找C::who
 
 
 
 
 
class A {
    protected static function foo() {
        static::who();
    }
 
    protected static function who() {
        echo __CLASS__."\n";
    }
}
 
class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }
 
    protected static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    protected static function who() {
        echo __CLASS__."\n";
    } 
}
 
C::test(); //A C C,解释同上
 
 
 
 
 
class A {
 public static function foo() {
     static::who();
 }
 
 private static function who() {
     echo __CLASS__."\n";
 }
}
 
class B extends A {
 public static function test() {
     A::foo();
     parent::foo();
     // self::foo();  
 }
 
 private static function who() {
     echo __CLASS__."\n";
 }
}
class C extends B {
 private static function who() {
     echo __CLASS__."\n";
 } 
}
 
C::test();
//A =>A::foo()的结果 
//报错 A不可C的私有方法who => parent::foo()能走到A的foo,里面static::who找C::who,C的who只能在C里调用,不能在A里调用
//报错 A不可C的私有方法who => self::foo()能走到B的foo,B继承A,走到A的foo,里面static::who找C::who,C的who只能在C里调用,不能在A里调用
登录后复制

三、new static()

//new self()与new static()的区别,官网例子如下: 
class A {
  public static function get_self() {
    return new self();
  }
 
  public static function get_static() {
    return new static();
  }
}
 
class B extends A {}
 
echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_static()); // A
登录后复制

推荐教程:《PHP视频教程

以上是PHP中如何形成static::与new static()的静态绑定的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

PHP Late静态绑定:突破传统编程思维的技术窍门 PHP Late静态绑定:突破传统编程思维的技术窍门 Sep 15, 2023 am 08:46 AM

PHPLate静态绑定:突破传统编程思维的技术窍门引言:传统的编程思维方式通常是在编译时就确定方法和属性的调用,但是在一些需要动态调用的情况下,这种方式就显得束缚和不灵活了。PHP中提供了一个强大的特性,即"Late静态绑定"(Latestaticbinding),它打破了传统的编程思维,为动态绑定方法和属性提供了便利。本文通过具体的代码示例,介绍了L

Java中的静态绑定和动态绑定 Java中的静态绑定和动态绑定 Aug 19, 2023 pm 02:57 PM

是的!当编译器知道要用于方法执行的对象时,它可以静态地将引用绑定到对象。例如,静态变量、私有变量和final变量使用静态绑定。而如果需要在运行时进行对象识别,则使用动态绑定。方法重写是动态绑定的一种情况。而方法重载是静态绑定的一种情况。

通过PHP Late静态绑定,打造高效可扩展的代码结构 通过PHP Late静态绑定,打造高效可扩展的代码结构 Sep 15, 2023 am 09:00 AM

通过PHPLate静态绑定,打造高效可扩展的代码结构摘要:在大型项目中,代码结构的可扩展性和高效性是非常重要的。PHPLate静态绑定是一种强大的特性,可以帮助我们构建易于维护和扩展的代码。本文将介绍PHPLate静态绑定的概念,并通过具体的代码示例来说明如何使用它来构建高效可扩展的代码结构。引言:随着企业的业务不断发展壮大,项目规模也逐渐增长。在这样

如何使用PHP Late静态绑定提高代码的重用性 如何使用PHP Late静态绑定提高代码的重用性 Sep 15, 2023 am 11:36 AM

如何使用PHPLate静态绑定提高代码的重用性引言:在PHP开发中,重用代码是提高开发效率和维护性的关键因素之一。PHP提供了多种技术来实现代码的重用性,其中一种重要的技术是使用Late静态绑定。本文将介绍Late静态绑定的概念、优势以及如何在实际开发中应用。一、Late静态绑定概述Late静态绑定是指根据调用时上下文动态地确定静态方法或属性的调用方式。在

解锁PHP Late静态绑定的技术奥秘 解锁PHP Late静态绑定的技术奥秘 Sep 15, 2023 am 09:39 AM

解锁PHPLate静态绑定的技术奥秘,需要具体代码示例近年来,PHP作为一种常用的服务器端脚本语言,受到了广大开发者的欢迎。随着PHP语言的发展,越来越多的编程技巧和特性被加入到了PHP中,其中之一就是Late静态绑定。Late静态绑定是指在继承关系中,子类能够重写和调用父类的静态方法和属性。这种继承关系可以很大程度上提高代码的灵活性和可扩展性。那么,让我

Java中静态绑定和动态绑定的区别 Java中静态绑定和动态绑定的区别 Aug 27, 2023 pm 11:09 PM

绑定是一种在方法调用和方法实际实现之间创建链接的机制。根据Java中的多态性概念,对象可以有许多不同的形式。对象形式可以在编译时和运行时解析。如果方法调用和方法实现之间的链接在编译时解析,则我们将其称为静态绑定;如果在运行时解析,则将其称为动态绑定。动态绑定使用对象来解析绑定,而静态绑定使用类和字段的类型。老先生。否。键静态绑定动态绑定1基本在编译时解析在运行时解决2解析机制 静态绑定使用类和字段的类型动态绑定使用对象来解析绑定3示例重载是静态绑定的示例方法重写是动态绑定的示例4.方法类型私有、

PHP Late静态绑定:优化代码继承的技术利器 PHP Late静态绑定:优化代码继承的技术利器 Sep 15, 2023 am 08:57 AM

PHPLate静态绑定:优化代码继承的技术利器背景介绍:在面向对象编程中,继承是一种常见的代码重用技术。通过继承,我们可以创建一个新的类,并从现有的类(称为父类或基类)继承属性和方法。这样,我们可以减少代码重复,提高代码的可维护性和扩展性。然而,在继承中,经常会遇到一个问题:在子类中调用父类的静态方法时,由于静态方法绑定是在编译时完成的,导致子类调用静态方

See all articles