NAMESPACE_SEPARATOR sabiti

2 Cevap php

PHP ad olması harika. Ad ayırıcı olarak '\' olması biraz ... garip (ama bu serin ve seksi olduğunu düşünüyor birisi varsa, ben bu yazı için etiket "rant" ekleme. ;).

Yani, burada bir soru çıkıyor:

Eğer kod NAMESPACE_SEPARATOR sabiti kullanıyor musunuz? Aşağıda kodu gibi:

<?php

if (!\defined('NAMESPACE_SEPARATOR') {

    \define('NAMESPACE_SEPARATOR', '\\');

} // if

Artıları:

  • Kullandığınız all bize DIRECTORY_SEPARATOR (;) ile tutarlı
  • ('\Foo\Bar' düşünüyorum ama '\\' . Foo' . '\\' . 'Bar') kaçan hiçbir karışıklık
  • daha okunabilir (IMHO)
  • etkisi iyi, ad-aware autoloaders yazma fırsatı bize veren
  • korkutucu bir şey olursa başka bir değişiklik kurtulamazsın (ol'good gibi '::' PHP 6 alfa)
  • Yabancılardan gelen programlama dili kara ad operatör olarak '\' arasında uniquess gizleyebilirsiniz ;)

Eksileri:

  • "DIRECTORY_SEPARATOR nedeni değerinin-alanı ayırıcı değil, platform bağlı olmasıdır." (Belirtildiği gibi http://bugs.php.net/bug.php?id=43046)
  • 1 yerine 19 karakter (\) ya da 4 ('\\')
  • Bu kullanamazsınız yerler (varsayılan sınıf değişkenleri olarak tam nitelikli bir sınıf adları) yani vardır:

    <?php
    
    class A {
    
        protected $sDefaultReporterClass = '\My\Namespace\DefaultReporter';
    
    }
    

Peki, sen ne düşünüyorsun?

2 Cevap

Ben de bütün nokta var emin değilim ... PHP sabitleri C önişlemci makroları gibi değildir. Sen bir makro oluşturmak ve bu-bu sadece işe yaramaz bir operatörün yerini alamaz:

<?php
define('ADD', '+');
echo (3 ADD 5); // Parse error: syntax error, unexpected T_STRING
?>

O amele bile, amaç ne? Size daha aşina başka bir dilde gibi görünmesi için bir dilin sözdizimini gizleme onu zor diğer kodlama proje üzerinde çalışmak için yapar oldukça zaman kaybı söz değil, olduğunu. Eğer dil X yerine PHP daha serin, iyi, sadece kod X göründüğünü düşünüyorsanız :)

Update

Tek tırnak o kaçtı gereken sadece yerlerden yana doğru bir teklif veya başka bir tersbölü önce olduğunu, bu nedenle yazılı olabilir kullanırken bir dize (örneğin autoloaders ve callbacks) olması 'gerekli yerlere ad ayırıcı kullanarak biraz zorluk sunuyor gibi-olduğunu:

$callback = 'Foo\Bar';

Tüm diğer seçenekler gereksiz karmaşıklığı gibi bana bak:

$callback = "Foo\\Bar";
$callback = 'Foo' . NAMESPACE_SEPARATOR . 'Bar';
$callback = "Foo{$namespace_separator}Bar";

Evet senin sorunun cevabı. Ben kendi kendine tanımlanan NAMESPACE_SEPARATOR çünkü kullanmak do

str_replace(NAMESPACE_SEPARATOR, DIRECTORY_SEPARATOR, $classFileName);

bana daha nettir

str_replace('\\', DIRECTORY_SEPARATOR, $classFileName);

Bu sadece benim autoloaders kullanılabilir olabilir ama ben satır aşağı birkaç yıl okumak için ne varsa hızlı bir şekilde kodu anlamak istiyorum.