PHP: "Küresel"

5 Cevap php

Şimdiki durum:

  • Ben current version denetleyicileri olarak sınıflarını kullanan benim MVC Framework var.
  • Ben basit kullanan benim old MVC Framework, düz denetleyicileri olarak içeren bazı "eski" modülleri var.

Çok anlamına gelir basitleştirilmiş:

New Version:

<?PHP
class blaController extends baseController {
    private $intVar;

    function dosomethingFunction() {
        $this->intVar = 123;
        $this->view('myView');
    }
}
?>

Old Version:

<?PHP
$globalVar = 123;
// view "controllername" is automatically shown
?>

Şimdi her şeyi yeniden yazmak zorunda kalmadan yeni MVC benim eski denetleyicileri kullanmaya muktedir bir sarıcı yazmaya çalışıyorum. Bunu yapmak için, bir "kapsayıcı" denetleyicisi var:

class wrapController extends baseController {
    function dosomethingFunction() {
        require 'old_dosomething.function.php';
        $this->view('old_dosomething_view');
    }
}

(Bir kez daha: Bu çok, çok basitleştirilmiş - sadece üzerinde fikir almak için değil gerçek kodu.).

Bu yaklaşım ile sorun daha önce global değişken $ globalVar artık sadece "yöntemiyle dosomethingFunction" içinde var ve görünüm tarafından erişilemez olmasıdır.

Ben $ globalVar bir kez daha küresel alanda mevcut olacağını, böylece "genel kapsamda" gibi davranmasına ihtiyaç zorlayacağını, bu durum olmazdı.

Yani: "require_global" veya benzer bir şey elde etmek için bir yol var mı?

(Benim problem için bir çözüm "küresel" komutları bir grup ile başlamak benim eski kontrolörleri değiştirmek olacaktır, ama ben o eski kod çok değiştirmek zorunda değilsiniz, bir çözümü tercih ederim.)

(Not: GLOBALS kötü olduğunu söyleme Lütfen tamamen bu sorunun noktasını özlüyor Sadece yeni, temiz bir ortamda çalışan bazı eski kod tutmak için bir gereklilik olduğunu kabul ediyoruz...)

5 Cevap

Eğer küresel kapsamı dosomethingFunction içinde tanımlanan yerel değişkenler () ekleyebilirsiniz:

class wrapController extends baseController {
    function dosomethingFunction() {
        require 'old_dosomething.function.php';
        //begin added code  
        $vararr = get_defined_vars();
        foreach($vararr as $varName => $varValue) 
              $GLOBALS[$varName] = $varValue;            
        //end added code          
        $this->view('old_dosomething_view');
    }
}

Beklendiği gibi bu iş için, işlevi başka bir şey kullanmadan önce gerektirir aramak gerektiğini unutmayın. get_defined_vars () geçerli kapsamdan sadece değişkenleri döndürür, böylece hiçbir array_diff kesmek ihtiyaç vardır.

Bu Aklıma en kolay çözümdür.

Iki get_defined_vars () işlevini kullanın ve gerekli dosya tarafından tanıtıldı hangi değişkenleri belirlemek için her çağrının bir diff olsun.

Örnek:

$__defined_vars       = get_defined_vars();
require('old_dosomething.function.php');
$__newly_defined_vars = array_diff_assoc($__defined_vars, get_defined_vars());
$GLOBALS = array_merge($GLOBALS, $__newly_defined_vars);
$this->view('old_dosomething_view');

Hmmm, bu ben daha önce hiç görmediğiniz bir konudur. Bunu yapmak varsayalım

class wrapController extends baseController {
    function dosomethingFunction() {
        require 'old_dosomething.function.php';

        // Force "old" globals into global scope
        $GLOBALS['globalVar'] = $globalVar;

        $this->view('old_dosomething_view');
    }
}

Ama biz bahsediyoruz kaç globallerinin bağlı olarak, hem de oldukça sıkıcı, manuel süreç. Ben bu konuda düşüneceğim, ama kafamın üst kapalı herhangi bir "oto-sihirli" bir çözüm bilmiyorum.

Herkes için ilgi: My (şimdiye kadar) nihai sürümü:

class wrapController extends baseController {
    function dosomethingFunction() {
        // ... do some initialisation stuff ...

        $__defined_vars = array_keys(get_defined_vars());

        require 'old_dosomething.function.php';

        $__newly_defined_vars = array_diff(
                                    array_keys(get_defined_vars()),
                                    $__defined_vars, 
                                    array('__defined_vars')
                                );
        foreach ($__newly_defined_vars as $var) {
            $GLOBALS[$var] = &$$var;
        }

        $this->view('old_dosomething_view');
    }
}

Çirkin, ama çalışıyor. Tüm büyük yardım için teşekkürler!

Zend Framework adlı Zend_Registry denediniz mi?

Kayıt defteri uygulama alanında nesneleri ve değerleri saklamak için bir kaptır. Kayıt defterindeki değeri depolayarak, aynı nesne uygulama boyunca her zaman mevcuttur. Bu mekanizma, küresel depolama kullanan bir alternatiftir.

http://framework.zend.com/manual/en/zend.registry.html