好的,问题是我正在使用一个类,它依赖于外部配置来工作和验证内容但是,由于这些属性的数量如此之多,我想知道如何导入它们。
所以,想象一下这是这样的类:
class doSomething{
public function __construct($conn){
$this->conn = $conn;
}
public function validateURL($url){
//do something with $url
}
public function validateName($name){
//do something with $name
}
public function validateAge($age){
// process age
}
public function lookEmailInDatabase($email, $table){
// process data
}
}
现在,让我们假设上述内容位于一个名为 doSomthingClass.php
的文件中
因此,让我们假设我有另一个类来声明这些属性的值
function declareProperties($val){
$conn = new PDO(...);
$url = 'http://foo.com';
$name = 'john';
$age = '17';
$email = 'simon@yahoo.com';
$table = 'foobartar';
return $val;
}
现在,问题是,将这些属性导出到此类中是非常有效、最好的方法,因为我什至不确定,设置是否应该写在函数或其他类中......
构造函数注入的替代方法是 setter 或属性注入。
它不像构造函数注入那样"干净",因为没有什么可以保证调用方确实会注入依赖项。
class Example {
private $property1;
// Property injection (note that the property is public)
public $property2;
private $property3;
public function __construct($param) {
// Constructor injection
$this->property1 = $param;
}
public function setProperty3($param) {
// Setter injection
$this->property3 = $param;
}
}
用法:
// Constructor injection
$o = new Example($dependency1);
// Property injection
$o->property2 = $dependency2;
// Sett injection
$o->setProperty3($dependency3);
现在,还可以从容器获取帮助,以自动在属性或资源库中注入依赖项。
我通常在控制器中获得很多依赖项,所以这就是我将使用属性/setter 注入的地方。您可以在本文中看到我如何使用我的容器来实现此目的。
使用魔法方法__get()
和__set()
怎么样:
public $vars = array();
public function __get( $key )
{
if( isset( $this->vars[$key] ) )
{
return $this->vars[$key];
{
else
{
return false;
}
}
public function __set( $key, $value )
{
$this->vars[$key] = $value;
}
举个例子:假设数据$row。如果使用列名作为属性名称(如果您很好地规划了结构,这也是一种很好的做法),则可以创建如下方法:
public function load( $row )
{
if( is_array( $row ) )
{
foreach( $row as $key => $value )
{
$this->$key = $value;
}
return true;
}
return false;
}
编辑:
你甚至不一定要像这样传入变量,你可以在外部使用公共方法:
$foo = new foo( $db );
$foo->bar( $three, $external, $params );
这是否适用于您的应用程序?