什么是PHP的后期静态绑定?
在PHP,程序被保存,然后直接在浏览器上运行,脚本通过 Web 服务器执行,我们得到输出。我们不手动编译PHP程序,但这并不意味着它永远不会被编译。 PHP解释器会为您执行此操作并运行它。所以有两个阶段,第一个,编译时和第二个运行时。在编译期间,普通变量被替换为它们的值,而静态关键字只在运行时被替换。覆盖子类中的一个属性并创建子类的实例,因此为了获得覆盖的输出,使用后期静态绑定概念,在使用该属性之前编写 static 关键字。每当PHP解释器收到编译函数的请求时。如果它看到任何静态属性,那么它会在运行时让该属性挂起,并且该属性在运行时从它被调用的函数获取它的值。这称为后期静态绑定。
后期静态绑定这个特性是在PHP 5.3 及以上版本引入的,之前的版本会显示致命错误。
下面的例子说明了PHP的后期静态绑定:
示例 1:在下面的代码中,我们有一个类 Car 及其子类newCar 。每当我们尝试通过作用域解析运算符(不创建对象)访问getOwner()函数时,就会遇到一些问题。这两个类都有getCar()函数,但是每当我们通过 newCar 类调用getOwner()函数,它将继承 Car 类中的getCar()函数而不是 newCar。
- 程序:在这个程序中我们不会使用静态绑定,我们将使用老派的自己,然后你会得到后期静态绑定的想法。
- 输出:
The car name is : Tesla The car name is : Tesla
- 程序 2:我们可以做的一件事是将 getOwner()函数从 Car 类复制到newCar类,但它可以用于小程序。如果您的程序包含 100 到 1000 个函数会怎样。为了解决这个问题,可以使用 static 关键字代替 self。该newCar类不列入包含getOwner()函数,但仍然继承了它的newCar getCar()函数。发生这种情况是因为getOwner( )在运行时而不是在编译时调用getCar() 。 Car 类中getOwner()函数的运行时访问,而不是编译或早期访问。这样,我们就可以在newCar()类中获取getOwner()函数,而无需创建对象。
- 输出:
The car name is : Tesla The car name is : Tesla and owner is Anshu.
示例 2: const 上的后期静态绑定,它的工作方式与静态方法相同,这意味着它是如何被调用的。对于 const,它不一定是静态的。
- 程序:
selfConst() ? 'yes' : 'no'; echo "\n"; // prints "yes" echo $two->staticConst() ? 'yes' : 'no'; ?>
- 输出:
no yes
在哪里使用它?
- 当函数被覆盖并且您想要显示新属性时。
- 程序太大的地方,你不能一次又一次地编写相同的函数。