$ this-> class-> function():它是如何工作的?

时间:2011-09-29 02:19:13

标签: php oop

我已经用PHP编程了好几年了,我刚刚开始研究面向对象的代码。现在我理解了课程等等:

class Myclass {

      public function __construct() {
      }
}

以及所有好东西......我也理解在index.php中创建函数和调用:

$someVar = new Myclass;

我一直在努力理解的一件事是,我最近看过codeigniter,我喜欢它的一件事,并且想要尝试在不使用codeigniter的情况下完成同样的事情。

在代码点火器中,他们有变量$ this似乎是他们的类变量。但是通过使用它,您可以同时从多个类中调用..例如:

$this->load->module(); which is in one class file..
$this->db->query(); which is in another class file.

我最近几天搜索谷歌试图弄清楚如何做同样的事情,每个类都有它们之间的相关性,所有允许我在我的项目中运行$ this-> class_name-> function_name而不是为每个类创建一个新变量,或者为了一个干净的索引文件,将每个函数都放在一个类文件中。

任何信息(除了买这本书 - 因为这对我来说都不是一个选项)非常感谢,我现在会感谢你(以后可能会再次感谢你的好评)。

2 个答案:

答案 0 :(得分:0)

loaddb引用是类属性,它们本身是分别具有公共module()query()方法的其他对象。例如

class MyClass
{
    /**
     * @var CI_DB
     */
    private $db;

    /**
     * @var Loader
     */
    private $load;

    public function __construct(CI_DB $db, Loader $load)
    {
        $this->db = $db;
        $this->load = $load;

        // PHP also allows you to add arbitrary object properties
        // that receive a "public" visibility
        // Please note, this is not a good practice
        $this->foo = new Foo;
    }

    public function someMethod()
    {
        $this->load->module();
        $this->db->query();

        // You can also use foo even though it is not defined
        // in the class properties
        $this->foo->something();
    }
}

请参阅http://www.php.net/manual/en/language.oop5.properties.php

像我们一样添加foo属性是危险的。因为它接收到public可见性,所以可以在类外部进行更改。

$class = new MyClass($db, $load);
$class->foo = new Bar;
$class->someMethod(); // will break if Bar does not contain a something() method

答案 1 :(得分:0)

我一直在读你和菲尔的评论。首先,您无法在$this上使用index.php$this只能在对象的上下文中使用。所以你可以做到,

$someVar = new Myclass;
...
$someVar->db->something();

...来代替。

我不完全确定“阅读课程”是什么意思,但你可以像菲尔指示的那样将成员分配到MyClass

class MyClass {
   private $inj;

   function __construct(Injected $inj) {
      $this->injected = $inj;
   }
}

请注意,private $inj声明不是强制性的,但跳过它是危险的。添加的任何未声明的成员都会自动public,如果您依赖魔法获取,这可能会让您失望。我会声明你需要的属性。

最后,您需要包含要使用的所有类定义,使用load_class()use autoloading等函数。如果上面的Injected不是声明的类,则在尝试创建类时会出错。 load_class()几乎肯定会以某种方式包含类定义。