我很难理解"静态"东西在PHP中是如何工作的.有人能指点我一个很好的教程吗?一个全面涵盖这个主题的人?
我理解在函数中使用静态变量,以及在类中使用静态成员.然而,除此之外,它有点模糊.
例如:我看到可以在不实例化类的情况下调用静态方法.不知道为什么这很重要,因为你可以用完全相同的方式调用非静态方法,只要它不引用$ this
后期静态绑定是另一个混乱的领域,以及我可以使用范围解析运算符的时间和地点.(看来我可以用它来调用父方法而不管它们是否是静态的......)
我是唯一一个苦苦挣扎的人吗?
虽然您可以在没有实例的情况下调用非静态方法,但这会触发E_STRICT警告.静态方法的重点是访问类上的静态变量,但许多人将它用作逻辑分组实用程序函数的方法,而不是定义一堆全局函数.
当您使用类的名称调用静态方法时,例如Class::foo(),没有实例,因此没有多态性.在foo由下式定义Class,直接调用.如果它没有定义这样的方法,则会搜索其超类,直到找到一个超类.
class Parent {
static function foo() {
echo "Parent::foo";
}
static function bar() {
echo "Parent::bar";
}
}
class Child extends Parent {
static function foo() {
echo "Child::foo";
}
}
Parent::foo(); // Parent::foo
Parent::bar(); // Parent::bar
Child::foo(); // Child::foo
Child::bar(); // Parent::bar
Run Code Online (Sandbox Code Playgroud)
当您使用self类方法中的关键字调用静态方法时,例如self::foo(),它就像您self要用保存调用代码的类的名称替换一样.
class Parent {
static function foo() {
echo "Parent::foo";
}
static function callFoo() {
self::foo(); // equivalent to Parent::foo()
}
}
class Child extends Parent {
static function foo() {
echo "Child::foo";
}
}
Parent::callFoo(); // Parent::foo
Child::callFoo(); // Parent::foo
Run Code Online (Sandbox Code Playgroud)
当您使用static类方法中的关键字static::foo()调用静态方法时,例如,您正在调用后期静态绑定.它不是foo在当前类中开始搜索,而是从当前类上下文开始,该类是最初静态引用的类.
class Parent {
static function foo() {
echo "Parent::foo";
}
static function callFoo() {
static::foo(); // late static binding
}
}
class Child extends Parent {
static function foo() {
echo "Child::foo";
}
static function callParentCallFoo() {
Parent::callFoo(); // resets static context to Parent
}
}
Parent::callFoo(); // Parent::foo
Child::callFoo(); // Child::foo
Child::callParentCallFoo(); // Parent::foo
Run Code Online (Sandbox Code Playgroud)
后期静态绑定与静态类属性的工作方式类似,但必须在子类本身中定义该属性.为类(例如Child::$foo = 'foo')分配新属性不会使其可用于父级的LSB.
| 归档时间: |
|
| 查看次数: |
1228 次 |
| 最近记录: |