Dinamik, statik bir değişken (dizi) çağrı

5 Cevap php

İşte bugün için benim soru. Ben (eğlenmek için) basit bir çiftleşmiş motoru inşa ediyorum. Ve ben bir yöntem ve bir eylem kırmak: temel fikir bu {içeriği blog} gibi bir etikete sahip olmasıdır. Sorun dinamik bir statik değişkeni aramak istediğiniz zaman, ben aşağıdaki hatayı olsun.

Parse error: parse error, expecting `','' or `';''

Ve kodu:

 $class = 'Blog';
 $action = 'content';
 echo $class::$template[$action];

$ Şablon benim sınıf içinde ortak bir statik değişken (array) ve ben almak istediğiniz biridir.

5 Cevap

Önce statik diziye bir başvuru kaydetmek isteyebilirsiniz.

class Test
{
    public static $foo = array('x' => 'y');
}

$class  = 'Test';
$action = 'x';

$arr = &$class::$foo;
echo $arr[$action];

Tüm düzenleme için özür dilerim ...

EDIT

echo $class::$foo[$action];

PHP 5.3 'te sadece iyi iş gibi görünüyor. Ahh, "Dynamic access to static methods is now possible" PHP 5.3 eklendi

Bi'şey değil ben yapıyorum ama bir deneyin vereceğim emin ne:

echo eval( $class . "::" . $template[$action] );

You cannot do that without using eval(). $class::$template (even if it was valid syntax in PHP), would reference the static variable called $template, you would actually need variable variables ($class::$$template), which is again not valid PHP syntax (you cannot access anything from a dynamic class name in PHP, IIRC).

Ben (regex kopyalanan PHP manual) olsa da, eval() usng önce geçerli adları için değişkenleri kontrol öneriyoruz:

if (!preg_match('[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*', $class)) {
    throw new Exception('Invalid class name (' . $class . ')');
}

PHP her şeyi olduğu gibi, aynı kediyi yolları bir yeri vardır. Ben ne istediğinizi gerçekleştirmek için en etkili yol olduğuna inanıyorum:

call_user_func(array($blog,$template));

Bkz: http://www.php.net/manual/en/function.call-user-func.php