PHP bir ad sıfırlama?

4 Cevap php

Nasıl küresel birine bir ad "reset" olabilir? Aşağıdaki kodu verildi:

namespace foo;
include 'myfile.php';

myfile.php şimdi sınıfları küresel ad olsa bile, foo ad kendi sınıflarının tüm yüklemeye çalışacağız. Şimdi bu satırların sırasını takas için büyük bir anlaşma olmaz, ama nasıl bir autoloader sahip myfile.php ile anlaşma olacak? Bu ad foo sınıfları yüklemeye çalışacağız.

4 Cevap

Ad bir per-file esasına göre çalışır. Myfile.php herhangi bir ad beyan etmezse o zaman her şey ne olursa olsun, include kullanılan hangi ad, genel ad ait olacaktır.

Uzun lafın kısası, namespace açıklamaları sadece kendi dosyası için geçerli içerir değil.

myfile.php genel ad bu myfile.php yükler sağlamak istiyorsanız içeri olmak istiyor ad bildirmek gerekir, ben koymak inanıyorum

namespace // empty namespace means global
{
}

myfile.php gövdesi etrafında. Eğer parantez kullandığınızdan emin olun, yoksa myfile.php ayrıca genel ad olmak dahil olduğu dosyanın geri kalanını yeniden tanımlamak gerekir.

Belki de sizin sorunuzu anlayamadım; bu durumda, ne olsun bir örnek sağlayabilir, ve ne beklediğiniz?


Are you sure it will try to load the functions from myfile.php in the foo namespace ?

Ben bir dosya var düşünürsek (temp-2.php) bu gibi görünüyor:

<?php
namespace foo;

function my_function_this_file() {
    var_dump(__FUNCTION__);
}
my_function_this_file();

include 'my_other_file.php';
my_function_the_other_file();

Ve başka bir * (my_other_file.php) * böyle görünüyor:

<?php

function my_function_the_other_file() {
    var_dump(__FUNCTION__);
}

Ben benim tarayıcıdan ilk aradığınızda, ben bu çıktıyı alıyorum:

string 'foo\my_function_this_file' (length=25)

string 'my_function_the_other_file' (length=26)

Herhangi bir ad beyan değil gerçeğine karşılık - Bu ikinci fonksiyon küresel hariç, herhangi bir isim alanı içinde değildir işaret gibi görünüyor.

Eğer doğru hatırlıyorsam, "ad" talimat sadece kullanılan dosya için geçerli değil, dahil dosyaları içindir.


namespaces FAQ den Import names cannot conflict with classes defined in the same file sayfa olduğunu da belirtmek gibi görünüyor.


Hope this helps, and I understood the question correctly...


EDIT: btw, bu gibi hatları sırasını takas:

<?php
include 'my_other_file.php';
namespace foo;

Işe yaramaz: "ad" talimat dosyasının ilk biri olmalıdır: Bunu yaparsanız, bir Ölümcül hata alırsınız:

Fatal error: Namespace declaration statement has to be the very first statement in the script

Ben sadece benim bulguları ile bu konuda uymak istiyorum. PHP __ toString yöntemleri istisnalar işleyemez yana, çözüm kendiniz yapmak için ise: çizgisinde bir şey

public function __toString()
{
    try {
        return $this->draw();
    } catch ( \Exception $e ) {
        die( \error::_getExceptionPage( $e ) );
    }
}

Ancak ne gerçekten garip olur, için çağrı namespace error::_getExceptionPage($e) __toString tanımlanmış olduğu sınıf olarak aynı olur - ve ben dışında etrafında bir yol bulmak mümkün değildi getExceptionPage olmak gerekir herhangi bir sınıf için \, yani her çağrısı ile benim istisna işleme kodunda şeyi prefixing \someClass::staticMethod().

Atılan istisna hatalı sınıfının ad gömülü olur beri tüm kod - Same dahil dosyalar, her şey için geçerli. PHP 5.3.17 ile test