php文件有包装类而不是文件函数中的参数

时间:2013-06-08 13:49:03

标签: php oop

我有以下文件:

`index.php`
`settings.php`
`functions.php`

settings.php

....
$object = new SomePhpClass();
....

index.php

require_once('settings.php');
require_once('functions.php');
....
some_function($object);
some_other_function($object);
....

functions.php

function some_function(SomePhpClass $object){
   //Do something with $object 

}
function some_other_function(SomePhpClass $object){
   //Do some here
}

在上面的代码中,我已经通过了函数中的$object。上面的代码现在起作用了。我希望functions.php接受wrapper classSomePhpClass,而不是直接传递$object。我是一个新手,并且不知道如何编写包装类来实现这一目标。

1 个答案:

答案 0 :(得分:1)

包装类可以用于很多不同的原因。大多数情况下,您使用它们来隐藏现有类的功能,以便使用者只能看到有限的接口(外观),或者您也可以使用它们来增强现有类或其方法(装饰器)的功能。有时它们被用作不同接口之间的适配器。

包装类的基本思想是定义一个包含要包装的对象的类(通常作为私有属性),并定义要使其可访问的方法。如果您的目的是隐藏原始对象的某些方法,则包装器类上的方法将是包装对象方法的一个子集,并且只是将调用转发给包装对象并返回它返回的任何内容。如果要扩展对象的功能,还可以在包装器上定义新方法,这些方法可以完成您希望它们对对象执行的任何操作。

典型的实现可能如下所示:

class SomePhpWrapper {
    /**
     * The wrapped object
     */
    private $wrapped;

    /**
     * Wrapping constructor
     */
    public function __construct(SomePhpClass $object) {
        $this->wrapped = $object;
    }

    /**
     * A method of the wrapped object we would like to explose on the wrapper
     */
    public function someMethod($someArgument) {
        return $this->wrapped->someMethod($someArgument);
    }

    /**
     * A decorated method which calls the wrapper class's method but also does something else
     */
    public function query($params) {
        $returnValue = $this->wrapper->query($params);
        doSomethingFunky();
        return $returnValue;
    }

    /**
     * Another exposed method
     */
    public function ping() {
        return $this->wrapped->ping()
    }

    /**
     * A decorator method that does not exist on the wrapped object but would be useful 
     */
    public function somethingComplicated() {
        $this->wrapped->query(this);
        $this->wrapped->query(that);
    }
}

这个包装器隐藏了原始类的一些方法,还添加了一个名为 somethingComplicated()的新方法。 但是,此包装器不是原始类的子类。当你编写使用这个包装类的函数时,他们不应该期望SomePhpClass,他们应该期待SomePhpWrapper。在你的情况下:

function some_function(SomePhpWrapper $object) {
    $object->ping(); // works
    $object->somethingComplicated(); // works
    $object->getDebug(); //fails, as getDebug() is not exposed by the wrapper
}

要使用此包装器,您可以这样:

$object = new SomePhpClass();
$wrapper = new SomePhpWrapper($object);
some_function($wrapper);