(PHP)我应该在类中创建“触发器”来访问受保护/私有函数吗?

时间:2017-11-18 14:51:45

标签: php class

我没有找到这个问题的答案没有,所以在这里:

我通常创建一个受保护/私有函数和公共函数来访问受保护/私有作为“触发器”,这是一个好习惯还是只是一个毫无意义的代码?

这是我正在谈论的一个例子......

public function addData($data_c, $data_a)
{
    if ($this->isUser()) {
        $this->addDataDB($data_c, $data_a);
    } else {
        die;
    }
}

private function addDataDB($data_c, $data_a)
{
    $connect = self::connect_data();
    $sql = "INSERT INTO `accounts`(...) VALUES (...)";

    $s_network = $data_c['s_network'];
    $country = $data_c['country'];
    $group_name = $data_c['group_name'];

    foreach ($data_a as $login_password) {

        $account = explode(':', $login_password);

        if (isset($account[0]) && !empty($account[0]) && isset($account[1]) && !empty($account[1])) {

            $login = $this->encryptData($account[0]);
            $password = $this->encryptData($account[1]);

            if (!$this->checkDuplicates($login)) {
                if ($stmt = $connect->prepare($sql)) {
                    $stmt->bind_param("sssssss", ...);
                    $stmt->execute();
                }
                $stmt->close();
            }
        }
    }
    $connect->close();
}

1 个答案:

答案 0 :(得分:0)

这不是一个坏主意,但更好的方法是创建一个处理安全访问的新装饰器类。另外,对于die来说,这是一个坏主意 - 相反,你应该抛出异常。

class A {
    function addData(...) {
        // ...
    }
}

class SecureA extends A {
    function addData {
        if (...) {
            throw new NotAllowedException(...);
        }
        parent::addData(...);
    }
}

如果您想更进一步,让代码更清晰,您应该使用界面,而不是从课程A延伸

interface InterfaceA {
    function addData(...);
}

class A implements InterfaceA {
    function addData(...) {
        // ...
    }
}

class SecureAccessA implements InterfaceA {

    /**
     * @var InterfaceA
     */
    private $a;

    public function __construct(InterfaceA $a) {
        $this->a = $a;
    }

    function addData(...) {
        if (...) {
            throw new NotAllowedException(...);
        }
        $this->a->addData(...);
    }
}

如果您更改SecureAccessA的界面,执行此操作会强制您修改InterfaceA。因此,您无法向A静默添加允许调用的函数,因为您忘记在子类中覆盖它们。