将类和方法的属性插入类的一些好方法是什么?

时间:2013-09-26 18:29:49

标签: php class oop properties dependency-injection

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

所以,想象一下这是班级:

   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;


}

现在,问题是,什么是非常有效的,将这些属性导出到这个类的最佳方法,因为我甚至不确定,是否应该在函数内部写入设置,或者另一个班..

2 个答案:

答案 0 :(得分:1)

构造函数注入的替代方法是setter或property injection。

它不像构造函数注入那样“干净”,因为没有什么能保证调用者确实会注入依赖项。

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获取帮助,以自动在属性或设置器中注入依赖项。

我通常在控制器中获得很多依赖项,因此我将使用property / setter注入。您可以看到in this article我如何使用我的容器。

答案 1 :(得分: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 );

这适用于您的应用程序吗?