我有以下文件:
`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 class
到SomePhpClass
,而不是直接传递$object
。我是一个新手,并且不知道如何编写包装类来实现这一目标。
答案 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);