1

好的,问题是我正在使用一个类,它依赖于外部配置来工作和验证事物,但是由于这些属性的数量如此之多,我想知道如何导入它们。

所以,想象一下这是一个类:

   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;


}

现在,问题是,将这些属性导出到这个类中的最有效、最好的方法是什么,因为我什至不确定是否应该将设置写在一个函数或另一个类中..

4

2 回答 2

1

构造函数注入的替代方法是设置器或属性注入。

它不像构造函数注入那样“干净”,因为没有任何东西可以保证调用者确实会注入依赖项。

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);

现在,您还可以从 Container 获得帮助,以在属性或设置器中自动注入依赖项。

我通常在控制器中有很多依赖项,所以我将在其中使用属性/设置器注入。你可以在这篇文章中看到我是如何使用我的容器来做这个的。

于 2013-09-27T07:47:00.980 回答
0

如何使用魔术方法__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 );

这对您的应用程序有用吗?

于 2013-09-26T18:45:44.327 回答