我没有找到这个问题的答案没有,所以在这里:
我通常创建一个受保护/私有函数和公共函数来访问受保护/私有作为“触发器”,这是一个好习惯还是只是一个毫无意义的代码?
这是我正在谈论的一个例子......
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();
}
答案 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
静默添加允许调用的函数,因为您忘记在子类中覆盖它们。