使用后期静态绑定引用 self 的 PHP 语法

Posted

技术标签:

【中文标题】使用后期静态绑定引用 self 的 PHP 语法【英文标题】:PHP syntax for referencing self with late static binding 【发布时间】:2010-03-28 21:29:57 【问题描述】:

当我学习 php 时,它几乎是程序形式的,最近我一直在尝试适应 OOP 的做事方式。然而,我一直关注的教程是在 PHP 5.3 之前产生的,当时引入了后期静态绑定。

我想知道从父类调用函数时如何引用self

例如,这两个方法是为作为 DatabaseObject 子级的 User 类编写的。现在它们位于 User 类中,但是,由于它们在 DatabaseObject 的其他子类中使用,我想将它们提升为包含在 DatabaseObject 中。

public static function find_all()
  
    global $database; 
    $result_set = self::find_by_sql("select * from ".self::$table_name);
    return $result_set;
  

和:

protected function cleaned_attributes()
  
    global $database; 
    $clean_attributes = array();
    foreach($this->attributes() as $key => $value) 
      
        $clean_attributes[$key] = $database->escape_value($value);
      
    return $clean_attributes;
  

所以我有三个问题:

1) 当我将 self:: 引用移动到父级时,如何更改它。是static:: 还是类似的东西? 2) 从我的代码中调用函数时,我是否以相同的方式调用它,作为子类的函数,例如 User::find_all() 或者那里也有变化? 3) 在我开始切碎之前我还需要知道什么吗?

【问题讨论】:

(参考) de3.php.net/manual/en/language.oop5.late-static-bindings.php 【参考方案1】:

1) 当我将 self::reference 移动到父级时,如何更改它。是静态的:: 还是类似的?

static

2) 从我的代码调用函数时,我是否以相同的方式调用它,作为子类的函数,例如 User::find_all() 还是那里也有变化?

它是User::find_all

3) 在我开始切碎之前我还需要知道什么吗?

是的。静态不是“OOP 的做事方式”。 OOP 是关于对象,而不是关于类。静态方法实际上是语法奇特的过程,而且和这些一样糟糕。

【讨论】:

我不记得说过静态是 OOP 的做事方式,我指的是作为一个整体的原则。静力学是我有疑问的事情之一,我只是想添加一些背景。不过感谢您的回答。 另外澄清一下,我在函数调用中去掉括号?我认为包含 () 是任何函数的标准,无论是否传递参数?【参考方案2】:

需要查找的其他一些相关位:

get_called_class() Reflection

【讨论】:

谢谢,get_call_class() 似乎不言自明。不过,反思会让我读一段时间。

以上是关于使用后期静态绑定引用 self 的 PHP 语法的主要内容,如果未能解决你的问题,请参考以下文章

后期静态绑定在PHP中的使用

后期静态绑定在PHP中的使用

PHP继承----静态延迟绑定

PHP面向对象-后期静态绑定

PHP 中 parentselfstatic$this 的区别 & 后期静态绑定详解

PHP 5.2 等效于后期静态绑定(新静态)?