Bu arayanın kapsamında bir işlev yordamı çalıştırmak mümkün mü?

5 Cevap

Düşünmek

aFunction() {
    $foo = 123;
    // a lot more code
}

aFunction();
echo $foo; // undefined

Arayanın kapsamı içine aFunction prosedürü koymak için bir yolu var mı?

5 Cevap

Hayır,

Bunun dışında değerini almak için aşağıdakilerden birini kullanmak zorunda:

  1. aFunction değerini dönün
  2. değer referans olarak aFunction içine geçti
  3. küresel kullanın

Küresel değişkenler kullanılarak mümkün, ama çok kötü bir fikir olduğunu söyleyebilirim. Bu olsa yapıyor hakkında gitmek için birkaç yol vardır:

Eğer aFunction dönüş değerini alabilir

function aFunction() {

    return 'hello!';

}

$foo = aFunction();
echo $foo; // output: hello!

veya referans $foo geçmek ve aFunction değeri üzerinde çalışmak var:

function aFunction(&$foo) {

    $foo = 'hello!';

}

$foo = '';
aFunction($foo);
echo $foo; // output: hello!

Ben tahmin ediyorum sadece orada birçoğu beri dönüş değeri çözüm makul olmadığını, çağrı kapsamında değişkenleri kullanmak istiyorum çünkü. Bu durumda, referans fikir çalışır, ancak daha iyi bir çözüm, bir sınıfta ihtiyaç değişkenleri kaydırmak olacaktır:

class Foo {

    public $foo;
    public $bar;
    public $baz;

}

function aFunction(Foo $foo) {

    $foo->foo = 'hello';
    $foo->bar = 'there';
    $foo->baz = 'mate';

    return $foo;

}

$foo = new Foo;
$foo = aFunction($foo);
echo "{$foo->foo} {$foo->bar} {$foo->baz}"; // output: hello there mate

Bu şekilde, siz de diğer işlevleri sınıfını kullanmak ve birlikte mantıksal gruplar bu değişkenler olabilir. Iyi uygulama değiştirme ve durumda hiç onlar / iade belirlenmeden önce değişkenler üzerinde işlem çeşit gerçekleştirmek gerekiyor, sınıf yöntemlerle bu değişkenleri almak olacaktır. Sen de bir sınıf ile pass-by-başvuru yöntemini kullanabilirsiniz, ama mümkünse bir işleve geçirilen zaman değişkenleri modifiye alıyorsanız bu yana, değerler döndürmek ayrılmamak için iyi bir beklenmedik yan etkisi olabilir.

Bu da Büyük Şey içine çok kötü bir fikir döner, işlev, parametre sayısını azaltır.

PHP 5.3 kapanışları destek gibi görünüyor.

http://www.ibm.com/developerworks/opensource/library/os-php-5.3new2/index.html

Aslında bir kapatma ne olduğunu bilen çok PHP geliştiriciler bulamazsınız, bu yüzden çok popüler değil bu şaşırtıcı değil.

Hayır, bu mümkün değil.

Sen get_defined_vars ve extract ile birlikte son derece çirkin bir şey koymak olabilir ama bu bile size sadece değerleri değil, gerçek değişkenler verecek.

Gerekirse global ile çalışmak için deneyin. Çoğu zaman, amaçlanan hedef temiz bir şekilde ulaşılabilir.

Sen kullanabilirsiniz global.

aFunction() {
    global $foo, $bar, $etc;
    $foo = 123;
    $bar = 456;
    $etc = 789;
    // a lot mveyae code
}

aFunction();
echo $foo . $bar . $etc; // 123456789

veya

aFunction() {
    $foo = 123;
    // a lot mveyae code
    return $foo;
}

echo aFunction(); // 123