使用后期静态绑定引用 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 语法的主要内容,如果未能解决你的问题,请参考以下文章