Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图理解php中的后期静态绑定_Php - Fatal编程技术网

试图理解php中的后期静态绑定

试图理解php中的后期静态绑定,php,Php,建议您阅读“对象继承”self在编译时静态地“绑定”。这意味着在编译代码时,将决定self所指的内容静态在运行时解析,即在执行代码时解析。这是后期静态绑定。这就是区别 对于self,在编译时(当代码被“读取”时),self指的是记录。稍后将解析User的代码,但是Record中的self::$tableName已经引用了Record::$tableName,不能再进行更改 使用static时,引用不会立即解析。只有在调用User::getTableName()时才会解析它,此时您处于User的上

建议您阅读“对象继承”

self
在编译时静态地“绑定”。这意味着在编译代码时,将决定
self
所指的内容<代码>静态在运行时解析,即在执行代码时解析。这是后期静态绑定。这就是区别

对于
self
,在编译时(当代码被“读取”时),
self
指的是
记录。稍后将解析
User
的代码,但是
Record
中的
self::$tableName
已经引用了
Record::$tableName
,不能再进行更改

使用
static
时,引用不会立即解析。只有在调用
User::getTableName()
时才会解析它,此时您处于
User
的上下文中,因此
静态::$tableName
解析为
用户::$tableName


换句话说:
self
总是指编写它的类,没有两种方式。静态
所指的内容取决于它在什么上下文中使用;实际上,这意味着,如果它所在的类正在扩展,那么它可能引用子类。这使得它的工作方式类似于
$this
,仅适用于静态上下文。

self
引用定义类范围

static
引用调用类作用域

self::$tableName
引用定义它的类。ie唱片


static::$tableName
引用调用它的类。ie用户

下面的示例将给出延迟静态绑定的最低示例:


B::getName()
A
输出
$name
变量,因为
self
是根据您在中定义的绝对当前类计算的。要解决这种情况,请使用
static

这只是猜测,但
static::
可能解析对象的实际类型,而不是编译时已知类型,并在该类型上查找名为
$tableName
的静态变量。+1“类似$This,仅用于静态上下文”。这可能是我听过的最有说服力的行为描述了官方PHP文档团队应该雇用你!或者自己主动帮助他们;-)
<?php
class Record {

    protected static $tableName = 'base';

    public static function getTableName() {
        echo self::$tableName;
    }
}
class User extends Record {
    protected static $tableName = 'users';
}
User::getTableName(); 
class A {
    static public $name = "A";

    static public function getName () {
        return self::$name;
    }

    static public function getNameLateStaticBinding () {
        return static::$name;
    }
}


class B extends A {
    static public $name = "B";
}



// Output: A
echo A::getName(), "\n";

// Output: A
echo B::getName(), "\n";

// Output: B
echo B::getNameLateStaticBinding() , "\n";