如何在PHP中模块化类方法?

时间:2015-03-31 10:09:51

标签: php oop

我是PHP的OOP新手。

我正在寻找一个如何模块化php类的最佳实践。我想要的是定义我的课程然后"加载"包含php文件的这个类的方法。

以下是一些代码来说明我的意思:

<?php /* module.php */

class MyClass_Module {

    public function foo(){
        print_r("Hello welt");
    }

}

<?php /* somewhere else */

class MyClass {

    function __construct($optionen = array()){
        require_once("module.php");
    }


}

$myObj = new MyClass();
$myObj->foo();

4 个答案:

答案 0 :(得分:0)

您正在寻找的是inheritance

试试这个:

Class MyClass() {
    public function Foo() {
        return 'Hello';
    }
}

Class MyExtendedClass extends MyClass() {
    public function Bar() {
        return 'World';
    }
    public function FooBar() {
        return Parent::Foo().' '.$this->Bar();
    }
}

$myObj = new MyExtendedClass;
echo $myObj->Foo(); // Outputs 'Hello';
echo $myObj->Bar(); // Outputs 'World';
echo $myObj->FooBar(); // Outputs 'Hello World';

要将它们保存在单独的文件中,您应该使用autoloader

<强>更新

如果您没有尝试访问相关功能,但尝试处理其他几个类,那么您需要的是Dependency Injection。您可以正常实例化类,然后将它们传递给其他类以使用它们。试试这个:

/* myworkerclass.php */
Class MyWorkerClass() {
    public function Foo()
    {
        return 'Hello';
    }
}

/* mypageclass.php */
Class MyPageClass() {
    private $dbConn;
    private $myWorkerObj;

    public function __construct(mysqli $dbConn, MyWorkerClass $myWorkerObj)
    {
        $this->dbConn = $dbConn;
        $this->myWorkerObj = $myWorkerObj;
    }

    public function Bar() {
        return ' World';
    }

    public function OutputFooBar()
    {
        return $this->myWorkerObj->Foo().$this->Bar();
    }
}

/* index.php */
$dbConn = new mysqli($host, $username, $password, $dbname);
$myWorkerObj = new MyWorkerClass;
$myPageObj = new MyPageClass($dbConn, $myWorkerObj);

echo $myPageObj->OutputFooBar(); // Outputs 'Hello World'
echo $myPageObj->myWorkerObj->Foo(); // Outputs 'Hello'
echo $myPageObj->Bar(); // Outputs ' World'

答案 1 :(得分:0)

我认为您需要了解的是autoload功能。

__autoload($class)允许你实例化任何类,只要{_ 1}}或require在__autoload()函数内部。这是一个非常强大的功能,因为它可以让你包含一个具有__autoload函数的php文件,该函数中声明的所有类将自动包含并实例化..有关更多信息,您可以访问我提供的链接..

答案 2 :(得分:0)

也许您应该看一下装饰器设计模式。

请参阅:http://sourcemaking.com/design_patterns/decorator/php

答案 3 :(得分:0)

我通过使用特征找到了解决方案:

<?php /* module.php */

trait MyClass_Module {

    public function foo(){
        print_r("Hallo Welt");
    }

}


<?php /* somewhere else */

require_once("module.php");

class MyClass {

    use MyClass_Module;

}

$myObj = new MyClass();

$myObj->foo();

感谢所有给我答案的人 - 我通过查看你的建议学到了很多东西。