Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 使用$this、self::、parent::实现代码可读性_Php_Coding Style_Kohana - Fatal编程技术网

Php 使用$this、self::、parent::实现代码可读性

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

我想知道在php类中使用self::method()和parent::method()是否可以接受/首选

您可以使用$this->method(),但$this->还可以引用类变量、父类变量或父类中的方法。self中没有歧义:

self::是否已贬值和/或使用此样式是否有任何警告或缺点

我理解self::和parent::引用类的静态实例,但在kohana中,除非您专门将方法定义为static,否则似乎没有区别

谢谢

添加了一个示例: 假设此应用程序存储来自多个网站的论坛

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);