PHP scoped fonksiyonu uygulamak nasıl?

6 Cevap php
function parent($key)
{
     function son()
     {
         global $key;
     }
}

Ben bunu başarmak istiyorum:

  1. son $key parent of erişebilir

Oldukça basit bir fonksiyon olarak, ben bir sınıfa parent değiştirmek istemiyorum

Tamam, function küresel anyway.Is için orada bir yol olduğunu söylendi son ardından parent $key içinde almak için?

6 Cevap

PHP 5.3 'ten beri bunu yapabilirsiniz:

function parent($key) {
    $son = function() use (&$key) {
        var_dump($key);
    };
    $son();
}
parent('foo');

Hakkında usort - Eğer böyle bir şey arıyorsun?

$key = 'foo';
$arr = array(
    array(0, 'foo' => 1),
    array(1, 'foo' => 4),
    array(2, 'foo' => -2),
);

usort($arr, function ($a, $b) use (&$key) {
    $a = $a[$key];
    $b = $b[$key];
    if ($a == $b) return 0;
    return ($a < $b) ? -1 : 1;
});

var_dump($arr);

Onlar inside ve tersi onlar tanımlanmış olsa bile, bir işlevin dışında denebilecek - PHP tüm fonksiyonları global scope var.

PHP manual Daha fazla bilgi için bakınız

OOP bu yapabileceğini ve içerisinde başka bir fonksiyon oluşturamazsınız. Ancak, bir şekilde bu gibi olabilir:

// make sure that parent function exists
if (function_exists('parent'))
{
   // ok fine, now create the son function
   function son()
   {
       global $key;
   }
}

Neden OOP yaklaşımı dikkate değil mi? Kamu / özel ... Tabii ki basitleştirmek değilim, ama bu yöne gidiyor hedefe ulaşmak için yardımcı olacaktır: Farklı düzenleyiciler kullanarak yöntemleriyle sınıf tanımlayın.

Eğer OOP kullanılarak değil ısrar, ama yine de bu okumak umulur gerekirse: http://www.steike.com/code/php-closures/ ve bu http://wiki.php.net/rfc/closures. Kapanışları beri ben OOP olmadan bunu nasıl biliyorum, ama fonksiyonel programlama kullanarak tek yolu bu.

Eğer usort(), olabilir bu çalışma söz beri?

$arr = array('foo', 'bar', 'tork', 'zug');

usort($arr, 'mysort');

function mysort($a, $b) {
    $a = do_something_with_a($a);
    $b = do_something_with_b($b);

    return strcmp($a, $b);
}

function do_something_with_a($val) {
    return strrev($val);
}
function do_something_with_b($val) {
    return strrev($val);
}

print_r($arr);

benim anlayış, sen çizgisinde geçti parametreye bağlı olarak, sizin için özel bir sıralama işlevi üreten bir işlev gerekir

function sorter($param) {
    return function($a, $b) use($param) {
        if($param == 'asc') return $a - $b;
        if($param = 'desc') return $b - $a;
    };
}

$a = array(1, 6, 2, 5, 3, 4);
usort($a, sorter('asc'));
print_r($a);
usort($a, sorter('desc'));
print_r($a);

(Php 5.3 sadece)