Cookie检查OOP

时间:2016-11-14 17:19:22

标签: php oop

直到昨天,我还在努力从程序性思维转向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的一步(或者这就是我的想法!)。

我的问题是:

  1. 这个尝试是从OOP的角度正确编写的吗?
  2. 如果是,有什么问题? (因为我猜这不止一个)
  3. 非常感谢你!

1 个答案:

答案 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.