PHP dinamik bir sınıf geçersiz kılmak için bazı hile var mı?

3 Cevap php

I test, iki farklı dosyaları, a.php ve b.php Örneğin, mantık bu gibi adlandırılmış iki sınıf vardır:

include('a.php');
$a = new test();
if($somcondition_is_met)
{
    include('b.php');
    $b = new test();
}

Önlemek için bazı hile var mı Fatal error: Cannot redeclare class?

3 Cevap

"Standart" PHP ile, hayır, böyle bir şey yapamaz.


Still, looking at PECL and the manual, a possibility would be to use the classkit extension -- but it's marked as "not maintained", and has not been updated since 2004... So I would definitly not use it.

Bu uzatma pecl sayfasını alıntı:

NOTICE: This package has been discontinued. Please refer to the runkit package which is fully BC with classkit and contains additional functionality.


So, let's take a look at the runkit extension, which might do the trick -- especially, the runkit_import function could interest you (quoting) :

Similar to include() however any code residing outside of a function or class is simply ignored. Additionally, depending on the value of flags , any functions or classes which already exist in the currently running environment will be automatically overwritten by their new definitions.

Yine de 5.3 desteği PHP söz konusu olduğunda ya ... iyi bir işaret değildir ... Hangi resmen (looking at it's PECL page) , runkit uzatma 2006 yılından bu yana güncellenen henüz, unutmayın. ..

İstediğiniz tam olarak ne yaptığı gibi classkit_import () görünüyor

http://www.php.net/manual/en/function.classkit-import.php

Link:

Example #1 classkit_import() example

newclass.php

<?php
class Example {
    function foo() {
        return "bar!\n";
    }
}
?>

main.php

<?php
// requires newclass.php (see above)
class Example {
    function foo() {
        return "foo!\n";
    }
}

$e = new Example();

// output original
echo $e->foo();

// import replacement method
classkit_import('newclass.php');

// output imported
echo $e->foo();

?>

The above example will output: foo! bar!

Ben dynamicaly derslere yazılmadan ziyade, arabirimleri kullanmak için daha iyi olduğunu düşünüyorum.

Senin kodunda arayüz sınıfını kullanmak / referans, ve bu arayüzü uygulamak birden fazla sınıflar olabilir daha.

Check the doc for more details on interfaces. http://php.net/manual/en/language.oop5.interfaces.php