Php 使用$this、self::、parent::实现代码可读性
我想知道在php类中使用self::method()和parent::method()是否可以接受/首选 您可以使用$this->method(),但$this->还可以引用类变量、父类变量或父类中的方法。self中没有歧义: self::是否已贬值和/或使用此样式是否有任何警告或缺点 我理解self::和parent::引用类的静态实例,但在kohana中,除非您专门将方法定义为static,否则似乎没有区别 谢谢 添加了一个示例: 假设此应用程序存储来自多个网站的论坛Php 使用$this、self::、parent::实现代码可读性,php,coding-style,kohana,Php,Coding Style,Kohana,我想知道在php类中使用self::method()和parent::method()是否可以接受/首选 您可以使用$this->method(),但$this->还可以引用类变量、父类变量或父类中的方法。self中没有歧义: self::是否已贬值和/或使用此样式是否有任何警告或缺点 我理解self::和parent::引用类的静态实例,但在kohana中,除非您专门将方法定义为static,否则似乎没有区别 谢谢 添加了一个示例: 假设此应用程序存储来自多个网站的论坛 class Forum
class Forum_Controller extends Controller {
function __construct()
{
parent::__construct();
}
function index()
{
echo self::categories();
}
/*
* get a list of categories from a specific site.
*/
private function categories()
{
$db = new Database;
$categories = $db->query("
SELECT * FROM
forum_categories
WHERE fk_site = '$this->site_id'
");
$view = new View('categories_view');
$view->categories = $categories;
return $view;
}
}
此示例适用于kohana,错误报告设置为:
错误报告(E_ALL&~E_STRICT)
$this->site\u id在主控制器核心类(kohana中的库)中定义
据我所知,$这不应该是可用的,因为我以静态方式调用self::categories(),但只有当我将categories()定义为静态时,它才会抛出错误
但正如我所说,我更喜欢使用self::因为从可读性的角度来看,我确切地知道这个函数应该在哪里,而不是使用$this,这对我来说会造成歧义。我认为self::通常用于静态函数和属性 我使用Kohana,也许控制器是静态的。有区别
$此
引用对象的实例
parent
和self
用于静态调用方法
解释得比我现在有时间写的更详细。第一个例子尤其有助于突出一些差异。我鼓励您复制粘贴第一个示例,并对其进行处理,因为我认为如果您还不知道它们之间的区别,那么这是一个重要的概念。控制器在Kohana中不是静态的,尽管它们可以包含静态成员变量/方法或常量
self::
是书写ClassName::
的一种简写方式,即
class Animal
{
public static $arms = 0;
}
class Dog extends Animal
{
public static $leg = 0;
const NAME = 'dog';
public static function bark()
{
echo 'Woof';
}
}
要调用静态函数或从类中获取常量,我们使用范围解析操作符::
。静态函数是每个类而不是每个对象。说::
引用类的静态实例是错误的,这只是访问静态方法的一种方式——没有对象实例具有这些方法
因此:
我们也可以使用
Animal::$arms
在类Dog中,我们可以使用self::
和parent::
这样我们就不需要键入完整的类名(因为它可能很长!)
不过,在回答您的问题时:No-self::
并没有被弃用,而且不,使用它也不是一种不好的做法。在kohana core中不使用它的原因是完全不同的。。。。(带有eval
的透明类扩展,详情请阅读下文…)
p、 静态调用非静态方法是错误的,不应该被允许-如果您设置了错误报告(E|ALL | E|u STRICT)
(就像您在开发过程中应该做的那样),您将看到出现错误
基本上发生的是:
Core有一个名为:
class Controller_Core {
public function someMethod(){}
}
您创建:
// We can use someMethod of Controller_Core
Index_Controller extends Controller {}
这实际上是在扩展Controller\u Core
,除非您创建了MY\u Controller.php,它将是类控制器扩展Controller\u Core
//MY_Controller.php
class Controller extends Controller_Core
{
// overloads Controller_Core::someMethod without us having to change the core file
public function someMethod(){}
}
我无法添加评论(显然我没有所需的代表!)
}
正如我所说,您应该使用错误报告(E|u ALL | E|u STRICT);(在kohana文件中更改)
静态调用private function categories()由于PHP中的一个错误而起作用,您不应该这样做:)另一件需要注意的事情是,如果要生成返回类别列表的静态控制器函数,MVC设计不是很好 控制器用于处理请求,模型用于处理数据(就是这样),视图用于显示 做一个模型
class Category_Model extends Model
{
public function categories($site_id)
{
$categories = $this->db->from('forum_categories')->where('fk_site',$site_id)->get();
return new View('categories_view', array('categories' => $categories));
}
}
我严格使用self::仅用于静态变量和静态成员函数感谢您花时间解释这一点。这很有帮助。我现在明白你所说的“静态函数是每个类而不是每个对象”的意思了。我将阅读benlumley提供的文档,但我仍然对我的代码仍然有效感到困惑:我在我的问题中添加了一些示例代码,请看一看。再次感谢。谢谢你的回复。文档链接非常有用。我无法找到合适的词来找到它,否则。parent不是(唯一)用于静态调用方法。如果从对象上下文调用它,它将使用对象上下文调用父类中的函数。此代码之所以有效,是因为您从未在静态调用的categories方法中引用对象的$this实例。
class Forum_Controller extends Controller {
public function __construct()
{
parent::__construct();
}
public function index()
{
echo self::categories();
}
/*
* get a list of categories from a specific site.
*/
private static function categories()
{
$db = new Database;
// You cannot use $this in a static function, because static functions are per class
// and not per object it doesnt know what $this is :) (make private static $site_id and use self::$site_id) if this is what you want
$categories = $db->query("
SELECT * FROM
forum_categories
WHERE fk_site = '$this->site_id'
");
$view = new View('categories_view');
$view->categories = $categories;
return $view;
}
class Category_Model extends Model
{
public function categories($site_id)
{
$categories = $this->db->from('forum_categories')->where('fk_site',$site_id)->get();
return new View('categories_view', array('categories' => $categories));
}
}
$cat = new Category_Model;
echo $cat->categories(1);