Üçüncü olarak tanımlanan isteğe bağlı olmayan bir argüman olan bir işlevi kullanmak için nasıl

5 Cevap php

Ben başkasının sınıfını kullanıyorum ve o kişi beş argümanlar ile bir işlev tanımlamıştır.

Sentry.php in:

function checkLogin($user = '',$pass = '',$group = 10,$goodRedirect = '',$badRedirect = '')

Beş alanlar doldurulur bu bir giriş prosedüre yol açar.

Şimdi o bu nasıl kullanılacağını açıklar sayfada php.net göre, mantıklı değil, bir pasajı var.

nöbetçi yükleyen bir sayfa:

require_once('../system/Sentry.php');
$theSentry = new Sentry();
if(!$theSentry->checkLogin(2)){ header("Location: login.php"); die(); }

Varsayılan olarak $ grubu argüman <= 10 (varsayılan) ise o kontrol eder gibi davranması gerektiğini, hangi. Bu durumda, iki olmalıdır. Kontrol kullanıcı <= 2 bir grup değişken varsa bu sayfayı görüntülemek için kişinin etkinleştirmeniz gerekir.

Ancak, bu iş ve bir çok belirgin bir nedenle değil: php manuel devletler:

Note that when using default arguments, any defaults should be on the right side of any non-default arguments; otherwise, things will not work as expected.

Yani phpbuilder.com göre kod, işlevine bir çağrı ile doldurmak için hiçbir isteğe bağlı ($variable = default_something) alanı olmalıdır ve kesinlikle beş argümanlar üçte olarak tanımlanan edilmemelidir.

? Nasıl böyle işlevini kullanabilirsiniz:

checkLogin(2)

5 Cevap

Standart argümanlar aşırı fonksiyonları eksikliği ile ilgili PHP'nin yoludur. Java'da bu yazabilirsiniz:

public void login(String username)
public void login(String username, String password)

PHP bu gibi çözmek zorunda:

function login($username, $password = '')

Bu şekilde $ username zorunludur ve $ parola isteğe bağlıdır. Bu kullanışlı olsa da, her zaman değil. Sizin örnekte orada argümanların bir günlük ve hepsi isteğe bağlıdır. Bunun için temiz bir çözüm işliyor 1 işlevi yapmak ve arayüzü daha temiz yapmak için 'kolaylık' yöntemleri eklemek olacaktır.

Yani ekleyin:

function checkLoginGroup($group = 10) {
  $this->checkLogin('', '', $group);
}

Bu sadece zaten var işlevini çağırır, ama temiz bir arayüz sağlar, sadece arama:

$theSentry->checkLoginGroup(2);

Bu (sizin ihtiyaçlarınıza bağlı olarak, ya da korumalı) sağlanan yöntemi özel yapmak ve uygulama ayrıntılarını gizlemek böylece kamu 'Convience' yöntemleri oluşturmak bile kıvrımlara bulunuyor.

Eğer veya orijinal sınıfını değiştirmek istemiyorsanız olamaz Ancak, bir alt sınıf oluşturmak mümkün olabilir.

Changing the order of the arguments is a possibility... But what for the time you'll need another argument to be "more optionnal" or "less optionnal" ? Will you change that order again ?
And, with it, every call that's made to the function ?

Sadece üçüncü argüman için, fonksiyonun bildirimini dikkate alınarak, görüyorum tek yöntem ilk iki için varsayılan değer (which you'll have to know, of course -- just look at it's declaration, for that) Passing ilk üç argüman ... vermektir:

checkLogin('', '', 20);

Bence, bunun yerine birinin bu kullanarak:

checkLogin(null, null, 20);

Açık olmanın avantajı vardır: işlevin bildiriminde bakarak birileri anında size ilk iki parametre için varsayılan değerleri kullanarak konum göreceksiniz.

NULL kullanarak, kodu okuma personn NULL (it could, afterall !) özel bir şekilde ele olup olmadığını görmek için işlevin kodu içinde kontrol etmesi gerekir; Birisi bu varsayılan değerleri geçen senin bir yol olduğunu anlamak için onlar ^ ^ varsayılan değerleri değil gibi o ... kadar kolay olmaz


Other solutions would imply refactoring the function,

Either way, you'd lose the ability your IDE has to show you the parameters the function is waiting for ; and that's bad :-(
And you'd also lose the phpdoc...

Diziler: ek Mythicas excellent answer, sadece isteğe bağlı bağımsız bir sürü ile ilgili başka bir yolu işaret etmek istiyorum.

function checkLogin($args) {
    $defaults = array('user' => null, 'pass' => null, 'group' => null, ...);
    $args = array_merge($defaults, $args);
    ...
}

checkLogin(array('user' => 'x', 'group' => 9));

Bu aslında isteğe bağlı / zorunlu argüman sözdizimi tamamen ve yerine Phps atlar dahili bunları özel işler. Bu tarif sorunu önleme ve işlev çağrısı son derece okunabilir yapma avantajına sahiptir. Sorun bu işlevi daha karmaşık hale getirir ve sizin için argümanlar varlığını kontrol PHP yararlanmak edemezler.

Kolay yolu $ grubu ilk böylece sadece argümanların sırasını değiştirmek için.

checkLogin(NULL,NULL,2);

ama dürüstçe kötü kodlama tarzı.