Eğer sınıf yöntemleri içinde süper küresellerle erişmek için PHP kötü form düşünün musunuz?

4 Cevap php

A class Account içindeki bir örnek login() fonksiyonu al.

class Account {
 /* Class variables */

    public function login() {
        if(isset($_POST['username']) && isset($_POST['password']))
            return $this->_formLogin();
        else if(isset($_SESSION['accountId']))
            return $this->_sessionLogin();
        else if(isset($_COOKIE['username']) && isset($_COOKIE['password']))
            return $this->_cookieLogin();
        else return false;
    }

    private function _formLogin() {
        //perform login actions using $_POST data
    }
    /* All that other stuff */
}

Veri hijyenikleştirmeye, şifre tuzlama, ve böyle görünmeyen yöntemler hakkında herhangi bir endişeniz yok saymak için bu an için deneyin. Kesinlikle konsantre login(), bu küresel erişim hayra alâmet nedir? Ben normalde sınıflar içinde PHP süper küresellerle kullanmaktan kaçının, ama bu durumda bunu yapmak için iyi bir sebep düşünemiyorum.

Sana büyü-in-the-arka globallerinin sınıflar arasında etkileşim ile ortaya çıkan istemem neden anlayabiliyorum, ancak bu globallerinin PHP yerleşik, sınıfı tarafından değiştirilmiş değildir, ve sadece bu sınıf tarafından kullanılmaktadır.

Bu bir kullanıcı oturum açmış gereken sayfaların başında bu neden olur:

$user = new Account($whatever, $objects, $we, $depend, $on);
if($user->login()) {
    //Do this stuff when logged in
}

bunun yerine, her sayfada bir, mantık daha sonra değiştirilmesi gerekebilir:

$user = new Account($whatever, $objects, $we, $depend, $on);
if(isset($_POST['username']) && isset($_POST['password']))
    $user->formLogin($_POST['username'], $_POST['password']);
else if(isset($_SESSION['accountId']))
    $user->sessionLogin($_SESSION['accountId']);
else if(isset($_COOKIE['username']) && isset($_COOKIE['password']))
    $user->cookieLogin($_COOKIE['username'], $_COOKIE['password']);
if($user->isLoggedIn() {
    //Do this stuff when logged in
}

Bunu işlemek için sınıfının dışında bir işlev oluştururken bir seçenek olduğunu farkındayım ederken, bu sınıfta küresellerle obfuscating kadar kötü olmaz mıydı?

4 Cevap

Ben düz bir evet ya da bu şekilde cevap yok olduğunu söyleyemem. (Tüm superglobals $_GET $_POST $_SESSION) ile fikir size kapsamı yerel değil tüm uygulama oturur veri soran ve ne olduğunu soruyor.

Ne bu superglobals ile gerçekleşebilir olduğunu ne veya fonksiyonun yürütülmesi sırasında (Allah korusun) önce sadece ne sebeple olursa olsun bir yere değiştirirseniz. Bu çoğaltmak için çok can sıkıcı bir hata olduğu ortaya açabilirsiniz.

Yani kötü şeklidir söyleyebilirim.

Benim kendi soruyu yanıtlamak için, evet, bu, süper küresellerle erişmek için birden çok sınıfları çapında erişilebilir onları değiştirerek kaydıyla ince olduğunu söyleyebilirim. Arka planda oluyor hiçbir büyü var - sadece devlet okuyorsanız, ve süper globallerinin PHP sizin için sağlar nasılsın.

Ancak, hiç, hiç bir sınıf içinde küresel bir değişiklik asla ve başka bir yere erişmek. Eğer birim test imkansız hale o zaman.

Bir yaklaşım kendi başına bir sınıf içine tüm superglobal'leri sarılmasıdır. Ben Zend Framework için, örneğin kendi başına bir sınıf vardır eminim Çerezler manipüle.

Ben sizin uygulamanızın tasarımına bağlıdır söyleyebilirim. Sınıf bazı genel, loosly birleştiğinde sınıf veya modülü ve aniden bu tür küresel değişkenler kullanıyorsa, o benim kitapta kötü bir uygulama olurdu. Sınıf açıkça bu özel küresel vars zaten gerekli olduğu için belirli bir görev (örn. giriş örneği) yönelikse Ama eğer, ben herhangi bir açık itirazları görmüyorum.