直到昨天,我还在努力从程序性思维转向OOP思维;今天早上我放弃了。我对自己说,我可能尚未准备好了解它。
我开始以通常的方式编码,编写一个函数来检查cookie是否“已记录”
function chkCookieLogin() {
if(isset($_COOKIE["logged"])) {
$logged = 'true';
$cookieValue = $_COOKIE["logged"];
return $logged;
return $cookieValue;
}
else {
$logged = 'false';
return $logged;
}
}
$result = chkCookieLogin();
if($result == 'true'){
echo $cookieValue;
}
else {
echo 'NO COOKIE';
}
因为我遇到了一个问题:我想返回两个变量($logged
和$cookieValue
)而不是一个。我谷歌它,我发现this answer Jasper使用OOP观点解释了一个方法(或者这是我能看到的)。
这个答案让我对OOP有了新的看法,所以我试图重写我试图通过这种方式实现的目标:
class chkCookie {
public $logged;
public $cookieValue;
public function __construct($logged, $cookieValue) {
$this->logged = $logged;
$this->cookieValue = $cookieValue;
}
function chkCookieLogin() {
$out = new chkCookie();
if(isset($_COOKIE["logged"])) {
$out->logged = 'true';
$out->cookieValue = $_COOKIE["logged"];
return $out;
}
else {
$out->logged = 'false';
return $out;
}
}
}
$vars = chkCookieLogin();
$logged = $vars->logged;
$cookieValue = $vars->cookieValue;
echo $logged; echo $cookieValue;
显然它在第一次尝试时没有起作用......在第二次和第三次都没有。但是我第一次觉得自己已经迈出了“真正触及”OOP的一步(或者这就是我的想法!)。
我的问题是:
非常感谢你!
答案 0 :(得分:3)
归功于@NiettheDarkAbsol关于返回Array数据类型的想法。
使用dependency injection,您可以设置如下对象:
class Factory {
private $Data = [];
public function set($index, $data) {
$this->Data[$index] = $data;
}
public function get($index) {
return $this->Data[$index];
}
}
然后要使用DI模块,您可以设置类似的方法(使用anonymous functions):
$f = new Factory();
$f->set('Cookies', $_SESSION);
$f->set('Check-Cookie', function() use ($f) {
return $f->get('Cookies')['logged'] ? [true, $f->get('Cookies')['logged']] : [false, null];
});
使用错误检查,我们可以在需要时调用该方法:
$cookieArr = is_callable($f->get('Check-Cookie')) ? call_user_func($f->get('Check-Cookie')) : [];
echo $cookieArr[0] ? $cookieArr[1] : 'Logged is not set';
我还考虑在DI类中添加常量,允许更多动态方法,而不是每次都进行错误检查。在set()
上的IE包含一个类似Factory::FUNC_ARRAY
的常量,因此您的get()
方法可以返回已执行的闭包。
如果您感到困惑,可以考虑使用ternary operators。
在3v4l.org处查看它。
如果它意味着什么,here is an OOP styled approach.