Nasıl ile autoload PHP ad kullanabilirim?

4 Cevap php

Ben autoload ve ad kullanmaya çalıştığınızda bu hatayı alıyorum:

Fatal error: Sınıf 'Sınıf1' /usr/local/www/apache22/data/public/php5.3/test.php üzerine bulunamadı line 10

Herkes yanlış yapıyorum bana söyleyebilir?

İşte benim kod:

Class1.php:

<?php

namespace Person\Barnes\David
{
    class Class1
    {
        public function __construct()
        {
            echo __CLASS__;
        }
    }
}

?>

dnm.php:

<?php

function __autoload($class)
{
    require $class . '.php';
}

use Person\Barnes\David;

$class = new Class1();

?>

4 Cevap

Class1 küresel kapsamında değildir.

Çalışan bir örnek için bakınız:

<?php

function __autoload($class)
{
    $parts = explode('\\', $class);
    require end($parts) . '.php';
}

use Person\Barnes\David as MyPerson;

$class = new MyPerson\Class1();

Edit (2009-12-14):

Sadece örnek basitleştirmek oldu "gibi ... Kullanım", benim kullanımını açıklamak.

Alternatif aşağıdaki gibiydi:

use Person\Barnes\David;

$class = new Person\Barnes\David\Class1();

Sizin __autoload function ad adı dahil, tam sınıf adını alacak.

Bu, sizin durumunuzda, __autoload function 'Person\Barnes\David\Class1' alırsınız ve sadece "Class1 'anlamına gelir.

Yani, "daha-karmaşık" adının bu tür başa çıkmak için, sizin autoloading kodunu değiştirmek zorunda; sık kullanılan bir çözüm ad alanı "seviye" başına dizinin bir seviye kullanarak dosyaları düzenlemek, ve, hakklı zaman, DIRECTORY_SEPARATOR tarafından ad adı '\' değiştirmektir.

Pascal MARTIN belirtildiği gibi, örneğin DIRECTORY_SEPARATOR ile '\' değiştirmeniz gerekir:

$filename = BASE_PATH . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php';
include($filename);

Ayrıca ben kodu daha okunabilir hale getirmek için, dirrectory yapısını yeniden düzenlemek için öneririm. Bu bir alternatif olabilir:

Dizin yapısı:

ProjectRoot
 |- lib

Dosya: /ProjectRoot/lib/Person/Barnes/David/Class1.php

<?php
namespace Person\Barnes\David
class Class1
{
    public function __construct()
    {
        echo __CLASS__;
    }
}
?>
  • Eğer tanımlanan her ad için alt dizin olun.

Dosya: /ProjectRoot/test.php

define('BASE_PATH', realpath(dirname(__FILE__)));
function my_autoloader($class)
{
    $filename = BASE_PATH . '/lib/' . str_replace('\\', '/', $class) . '.php';
    include($filename);
}
spl_autoload_register('my_autoloader');

use Person\Barnes\David as MyPerson;
$class = new MyPerson\Class1();
  • Ben php autoloader beyanı için 5 recomendation kullanılır. PHP 4 ile hala varsa, eski sözdizimi ile değiştirin: function __ autoload ($ sınıfı)

Tüm ad alanları maddenin kutuyu ile - - Ben özdevinimli_yükle fonksiyonları sadece "tam" classname aldığınız bakın aşağıdaki iki durumda:

[A] = new \ Tam \ Ad \ CoolClass $ ();

[B] SomeNamespace olarak \ Tam \ Ad alanı kullanabilirsiniz; (Kaynak dosyanın en üstünde)) ($ a = new SomeNamespace \ CoolClass izledi;

Ben özdevinimli_yükle işlevleri aşağıdaki durumda tam classname almak YAPMAYIN görüyoruz:

[C] \ Tam \ Ad alanı kullanabilirsiniz; (Kaynak dosyanızın üstünde) $ a = new CoolClass () izledi;

GÜNCELLEME: [c] bir hatadır ve ad zaten nasıl çalıştığını değildir. Ben yerine [c], aşağıdaki iki olgu da iyi çalışır, bu rapor edebilirsiniz:

[D] \ Tam \ Ad alanı kullanabilirsiniz; (Kaynak dosyanın en üstünde)) ($ a = new Namespace \ CoolClass izledi;

[E] \ Tam \ Ad \ CoolClass kullanın; (Kaynak dosyanızın üstünde) $ a = new CoolClass () izledi;

Umarım bu yardımcı olur.