Ne bir ad olduğunu ve nasıl PHP uygulanmıştır?

4 Cevap php

Ben son PHP isim alanları desteği vardır duydum. Ben küresel alanda tanımlı değişkenler no ad var biliyorum, bu yüzden nasıl bir farklı bir ad alanında bir değişken yapar?

Sadece değişkenler / fonksiyonları kategorize bir yolu var mı?

4 Cevap

Ad değişkenleri, işlevleri ve sınıfları düzenlemek için bir programlama dili mekanizmadır. PHP 5.3 Ben aşağıdaki örnekte göstermek olacak ad alanları için destek ekler:

Eğer aynı sınıf adını User kullanabilirsiniz, ancak her farklı uygulamaları var iki projeyi birleştirmek istiyorum ki:

// Code for Project One (proj1.php)
<?php
  class User {
    protected $userId;
    public function getUserId() {
      return $this->userId;
    }
  }
  $user = new User;
  echo $user->getUserId();
?>

// Code for Project Two (proj2.php)
<?php
  class User {
    public $user_id;
  }
  $user = new User;
  echo $user->user_id;
?>

<?php
  // Combine the two projects
  require 'proj1.php';
  require 'proj2.php'; // Naming collision!
  $myUser = new User; // Which class to use?
?>

PHP az 5.3 sürümleri için, User bir adlandırma çarpışmayı önlemek için projelerinden biri tarafından kullanılan sınıfın tüm örnekleri için sınıf adını değiştirerek sorun üzerinden gitmek olurdu:

<?php
  class ProjectOne_User {
    // ...
  }
  $user = new ProjectOne_User; // Code in Project One has to be changed too
?>

Bir proje oluştururken veya daha büyük 5.3 eşit PHP sürümleri için, bir isim alanı bildirimi ekleyerek, ad kullanabilirsiniz:

<?php
  // Code for Project One (proj1.php)
  namespace ProjectOne;
  class User {
    // ...
  }
  $user = new User;
?>

<?php
  // Combine the two projects
  require 'proj1.php';

  use ProjectOne as One; // Declare namespace to use

  require 'proj2.php' // No collision!

  $user = new \One\User; // State which version of User class to use (using fully qualified namespace)

  echo $user->user_id; // Use ProjectOne implementation
?>

Daha fazla bilgi için:

A namespace kodunu düzenlemek için izin verir ve size öğeleri saklanması için bir yol verir.

Bir dosya sistemi grup ilgili dosyaları dizinleri kullanır gibi ad oluşturulabiliyor.

Temelde bir yol sağlar ad alanlarına birbirleriyle ilişkili sınıflar, işlevler ve sabitler.

Ayrıca PHP sınıfları / işlevleri / sabitleri arasındaki isim çakışmaları önlemek için yardımcı olur ve ekstra uzun sınıf isimlerini kaçınarak, kod okunabilirliği artırmak.

Örnek namespace bildirimi:

<?php
namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

?>

Ad kütüphanelerden sınıfları ve fonksiyonları alırken çarpışmalar adlandırma sorunu çözmek.

Eğer aynı isimde bir fonksiyon / sınıf tanımlamak için başına iki kitaplıkları eklerseniz ad alanları olmadan, (yani, hem 'kullanıcı' olarak adlandırılan bir sınıf içeren iki kütüphaneler), başarısız olur.

PHP hiçbir ad desteği, en kütüphaneler isim çarpışmaları önlemek amacıyla, benzersiz olması muhtemeldir şey ile onların fonksiyonu / sınıf isimlerini önek almış. Bu sorun artık işlev veya sınıf adları oluşturur vardır.

here verilen örnek, istisna sınıfına ait ise:

PEAR_Form_Loader_Validate_Table_Element_Validator_Exception.

Seçtiğiniz bir isim - Sen 'AS' anahtar sözcüğünü kullanarak bir takma ad olarak kendi yerel kapsam içine uzun bir ad dan alabilirsiniz. Bu nedenle, hala yerel kapsamında seçtiğiniz kısa bir sınıf adı olabilir.

Aşağıdaki Zend :: DB DbConnection denilen bir 'ad' :: Bağlantı geçerlidir.

use Zend::DB::Connection as DbConnection

Ad sık kütüphaneleri ile kullanılır, 1 tek namespace zaten kullanılmakta olan diğerleri kadar zarar vermiyorum yardımcı olan kütüphane kod başvurmak için yeteneği.