PHP Kilitler ...

5 Cevap php

Yani tarih, nesne yönelimli moda kadar, bir nice boyunca programlama ediyorum. Ben düzenli uygular PHP ama ben kapanışları kullanmanız gerekebilir zaman ben merak ediyorum OOP çeşitli yönleriyle faydalanmak. Herhangi o kapanışları uygulamak için faydalı olacağını zaman biraz ışık tutabilir orada uzmanlar?

5 Cevap

Eğer şimdi üzerine karar verdik, bir görevi yerine ileride bir işlev gerekir zaman.

Eğer bir config dosyası okumak ve parametrelerden biri hash_method sizin algoritması için multiply ziyade olduğunu söyler Örneğin, square, bir oluşturabilirsiniz Bir şey karma için ihtiyacınız olan her yerde kullanılır kapatılması.

Kapak (örneğin), config_parser() oluşturulabilir; o do_hash_method() config_parser() (config dosyasından) yerel değişkenleri kullanarak adında bir işlev oluşturur. do_hash_method() denir zaman, o bu kapsamda çağrıldığını değil olsa bile config_parser() yerel kapsamında değişkenlere erişimi vardır.

Umarım iyi bir varsayımsal bir örnek:

function config_parser()
{
    // Do some code here
    // $hash_method is in config_parser() local scope
    $hash_method = 'multiply';

    if ($hashing_enabled)
    {
    	function do_hash_method($var)
     	{
    		// $hash_method is from the parent's local scope
    		if ($hash_method == 'multiply')
    			return $var * $var;
    		else
    			return $var ^ $var;
    	}
    }
}


function hashme($val)
{
    // do_hash_method still knows about $hash_method
    // even though it's not in the local scope anymore
    $val = do_hash_method($val)
}

PHP 5.3 doğal kapakları destekleyecektir. Eğer bazı küçük, belirli bir amaç için sadece kullanılan yerel bir işlev istediğinizde bir kapatma iyidir. RFC for closures iyi bir örnek vermek:

function replace_spaces ($text) {
    $replacement = function ($matches) {
        return str_replace ($matches[1], ' ', ' ').' ';
    };
    return preg_replace_callback ('/( +) /', $replacement, $text);
}

This lets you define the replacement function locally inside replace_spaces(), so that it's not:
1) Cluttering up the global namespace
2) Making people three years down the line wonder why there's a function defined globally that's only used inside one other function

Bu organize şeyler tutar. Kendisi işlevi adı yok nasıl fark, sadece tanımlanmış ve $replacement için bir referans olarak atanır.

Ama PHP 5.3 için beklemek zorunda, unutmayın :)

Apart teknik detaylar, kapanışları fonksiyon yönelimli programlama olarak bilinen bir programlama stili için temel bir ön koşul vardır. Nesne yönelimli programlama için bir nesneyi kullanmak gibi bir kapatma kabaca aynı şey için kullanılır; Size sonra başka bir yerde etrafında geçebilir, birlikte biraz kod (bir işlev) ile veri (değişkenler) bağlar. Eğer programları yazmak biçimini değiştirmek yoksa - - onlar hiç bir etkisi yok programları yazmak ya da yolda bu, onlar etkisi gibi.

PHP zaten sınıf tabanlı, nesne yönelimli paradigma, hem de eski usul biri ağır olduğu PHP bağlamda, onlar biraz garip. Genellikle, kapanışları olan dillerde, tam sözcük kapsamı vardır. Geriye uyumluluğu korumak için, PHP bu almak için gitmiyor, böylece kapaklar diğer dillerde daha burada biraz farklı olacak demektir. Ben onlar kullanılacak tam olarak nasıl görmek için henüz düşünüyorum.

Ben troelskn gönderimizde tarafından sağlanan içeriği gibi. PHP Dan Udey örneğinde gibi bir şey yapmak istediğinizde, i OO Strateji Desen kullanın. Benim görüşüme göre, bu kimin davranış zamanında belirlenir, yeni bir global işlevini tanıtan daha iyidir.

http://en.wikipedia.org/wiki/Strategy_pattern

Ayrıca büyük PHP, içinde yöntem adı tutan bir değişken kullanarak işlevleri ve yöntemleri çağırabilir. böylece Dan'in Örneğin başka almak böyle bir şey olacaktır:

class ConfigurableEncoder{
        private $algorithm = 'multiply';  //default is multiply

        public function encode($x){
                return call_user_func(array($this,$this->algorithm),$x);
        }

        public function multiply($x){
                return $x * 5;
        }

        public function add($x){
                return $x + 5;
        }

        public function setAlgorithm($algName){
                switch(strtolower($algName)){
                        case 'add':
                                $this->algorithm = 'add';
                                break;
                        case 'multiply':        //fall through
                        default:                //default is multiply
                                $this->algorithm = 'multiply';
                                break;
                }
        }
}

$raw = 5;
$encoder = new ConfigurableEncoder();                           // set to multiply
echo "raw: $raw\n";                                             // 5
echo "multiply: " . $encoder->encode($raw) . "\n";              // 25
$encoder->setAlgorithm('add');
echo "add: " . $encoder->encode($raw) . "\n";                   // 10

Eğer her yerde kullanılabilir olmasını istiyorsanız, tabii ki, sadece her şeyi statik yapabiliriz ...

@ john Boker - Onlar PHP 5.3, inanıyorum ki, geliyor

İşte onlar hakkında iyi bir bağlantı kendi yararlılığı bazı açıklayan, bu http://wiki.php.net/rfc/closures