国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Ruang nama PHP

Ruang nama PHP (ruang nama)

Ruang nama PHP (ruang nama) telah ditambahkan dalam PHP 5.3 Jika anda telah mempelajari C# dan Java, maka ruang nama bukanlah perkara baharu. Walau bagaimanapun, ia masih mempunyai kepentingan yang sangat penting dalam PHP.

Ruang nama PHP boleh menyelesaikan dua jenis masalah berikut:

1 Konflik nama antara kod yang ditulis pengguna dan kelas/fungsi/pemalar PHP atau kelas/fungsi/pemalar pihak ketiga.

2. Cipta nama alias (atau pendek) untuk nama pengecam yang sangat panjang (biasanya ditakrifkan untuk mengurangkan jenis masalah pertama) untuk meningkatkan kebolehbacaan kod sumber.

Tentukan ruang nama

Secara lalai, semua nama pemalar, kelas dan fungsi diletakkan dalam ruang global, sama seperti PHP menyokong penamaan Ruang adalah sama macam dulu.

Ruang nama diisytiharkan menggunakan ruang nama kata kunci. Jika fail mengandungi ruang nama, ia mesti mengisytiharkan ruang nama sebelum semua kod lain. Format sintaks adalah seperti berikut;

< ?php 
// 定義代碼在 'MyProject' 命名空間中 
namespace MyProject; 
// ... 代碼 ...

Anda juga boleh menentukan kod ruang nama yang berbeza dalam fail yang sama, seperti:

< ?php 
namespace MyProject1; 
// MyProject1 命名空間中的PHP代碼 
namespace MyProject2; 
// MyProject2 命名空間中的PHP代碼   
// 另一種語(yǔ)法
namespace MyProject3 { 
 // MyProject3 命名空間中的PHP代碼   
} 
?>

Satu-satunya kod undang-undang sebelum mengisytiharkan ruang nama adalah untuk menentukan fail sumber Pengekodan mengisytiharkan kenyataan. Semua kod bukan PHP, termasuk ruang putih, tidak boleh muncul sebelum pengisytiharan ruang nama.

<?php
declare(encoding='UTF-8'); //定義多個(gè)命名空間和不包含在命名空間中的代碼
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}
namespace { // 全局代碼
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>

Kod berikut akan menyebabkan ralat sintaks:

<html>
<?php
namespace MyProject; // 命名空間前出現(xiàn)了“<html>” 會(huì)致命錯(cuò)誤 - 命名空間必須是程序腳本的第一條語(yǔ)句
?>

Ruang nama kecil

dan direktori Sama seperti fail, ruang nama PHP juga membolehkan anda menentukan nama ruang nama hierarki. Oleh itu, nama ruang nama boleh ditakrifkan dalam cara hierarki:

<?php
namespace MyProject\Sub\Level;  //聲明分層次的單個(gè)命名空間
const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */  }
?>

Contoh di atas mencipta MyProjectSubLevelCONNECT_OK yang berterusan, kelas MyProjectSubLevelConnection dan fungsi MyProjectSubLevelConnect.


Penggunaan ruang nama

Nama kelas dalam ruang nama PHP boleh dirujuk dalam tiga cara:

1 Nama tidak layak, atau nama kelas yang tidak mengandungi awalan, seperti $a=new foo( atau foo: :staticmethod();. Jika ruang nama semasa ialah currentnamespace, foo akan diselesaikan kepada currentnamespacefoo. Jika kod yang menggunakan foo bersifat global dan tidak mengandungi kod dalam mana-mana ruang nama, foo akan diselesaikan sebagai foo. Amaran: Jika fungsi atau pemalar dalam ruang nama tidak ditentukan, fungsi tidak layak atau nama pemalar diselesaikan kepada fungsi global atau nama tetap.

2. Nama yang layak, atau nama yang mengandungi awalan, seperti $a = new subnamespacefoo( atau subnamespacefoo::staticmethod();. Jika ruang nama semasa ialah currentnamespace, foo akan diselesaikan kepada currentnamespacesubnamespacefoo. Jika kod yang menggunakan foo adalah global, kod tidak terkandung dalam mana-mana ruang nama, foo akan diselesaikan kepada subnamespacefoo.

3. Nama yang layak sepenuhnya, atau nama yang termasuk operator awalan global, sebagai contoh, $a = new currentnamespacefoo( atau currentnamespacefoo::staticmethod();. Dalam kes ini, foo sentiasa diselesaikan kepada nama literal currentnamespacefoo dalam kod.

Berikut ialah contoh menggunakan tiga kaedah ini:

kod fail1.php

<?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo
{
    static function staticmethod() {}
}
?>


kod fail fail2.php

<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
    static function staticmethod() {}
}
/* 非限定名稱 */
foo(); // 解析為 Foo\Bar\foo resolves to function Foo\Bar\foo
foo::staticmethod(); // 解析為類 Foo\Bar\foo的靜態(tài)方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO
/* 限定名稱 */
subnamespace\foo(); // 解析為函數(shù) Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析為類 Foo\Bar\subnamespace\foo,
                                  // 以及類的方法 staticmethod
echo subnamespace\FOO; // 解析為常量 Foo\Bar\subnamespace\FOO                       
/* 完全限定名稱 */
\Foo\Bar\foo(); // 解析為函數(shù) Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析為類 Foo\Bar\foo, 以及類的方法 staticmethod
echo \Foo\Bar\FOO; // 解析為常量 Foo\Bar\FOO
?>

Perhatikan bahawa untuk mengakses mana-mana kelas global, fungsi atau pemalar, anda boleh menggunakan nama yang layak sepenuhnya, seperti strlen() atau Exception atau INI_ALL.

Akses kelas global, fungsi dan pemalar di dalam ruang nama:

<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
 
$a = \strlen('hi'); // 調(diào)用全局函數(shù)strlen
$b = \INI_ALL; // 訪問全局常量 INI_ALL
$c = new \Exception('error'); // 實(shí)例化全局類 Exception
?>

Ruang nama dan ciri bahasa dinamik

Pelaksanaan ruang nama PHP dipengaruhi oleh sifat dinamik bahasa itu sendiri. Jadi, jika anda ingin menukar kod di bawah kepada ruang nama, akses elemen secara dinamik.

example1.php kod fail:

<?php
class classname
{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
}
function funcname()
{
    echo __FUNCTION__,"\n";
}
const constname = "global";
 
$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
?>

Mesti menggunakan nama yang layak sepenuhnya (nama kelas termasuk awalan ruang nama). Ambil perhatian bahawa garis miring ke belakang utama tidak diperlukan kerana tiada perbezaan antara nama layak dan layak sepenuhnya dalam nama kelas dinamik, nama fungsi atau nama tetap.

Akses dinamik kepada elemen ruang nama

<?php
namespace namespacename;
class classname
{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
}
function funcname()
{
    echo __FUNCTION__,"\n";
}
const constname = "namespaced";
include 'example1.php';
$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
 
/* note that if using double quotes, "\namespacename\classname" must be used */
$a = '\namespacename\classname';
$obj = new $a; // prints namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // also prints namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // prints namespacename\funcname
$b = '\namespacename\funcname';
$b(); // also prints namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // prints namespaced
echo constant('namespacename\constname'), "\n"; // also prints namespaced
?>

kata kunci ruang nama dan __NAMESPACE__ Pemalar

PHP menyokong dua kaedah abstrak untuk mengakses elemen dalam ruang nama semasa, pemalar ajaib __NAMESPACE__ dan kata kunci ruang nama.

Nilai pemalar __NAMESPACE__ ialah rentetan yang mengandungi nama ruang nama semasa. Dalam kod global, tidak termasuk dalam mana-mana ruang nama, ia mengandungi rentetan kosong.

__NAMESPACE__ contoh, kod dalam ruang nama

<?php
namespace MyProject;
echo '"', __NAMESPACE__, '"'; // 輸出 "MyProject"
?>

__NAMESPACE__ contoh, kod global

<?php
echo '"', __NAMESPACE__, '"'; // 輸出 ""
?>

Malar __NAMESPACE__ berguna apabila mencipta nama secara dinamik, contohnya:

Gunakan __NAMESPACE__ untuk mencipta nama secara dinamik

<?php
namespace MyProject;
 
function get($classname)
{
    $a = __NAMESPACE__ . '\' . $classname;
    return new $a;
}
?>

Ruang nama kata kunci boleh digunakan untuk mengakses elemen secara eksplisit dalam ruang nama atau sub-ruang nama semasa. Ia bersamaan dengan pengendali diri dalam kelas.

pengendali ruang nama, kod dalam ruang nama

<?php
namespace MyProject;
 
use blah\blah as mine; // see "Using namespaces: importing/aliasing"
 
blah\mine(); // calls function blah\blah\mine()
namespace\blah\mine(); // calls function MyProject\blah\mine()
 
namespace\func(); // calls function MyProject\func()
namespace\sub\func(); // calls function MyProject\sub\func()
namespace\cname::method(); // calls static method "method" of class MyProject\cname
$a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname
$b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b
?>

pengendali ruang nama, kod global

<?php
namespace\func(); // calls function func()
namespace\sub\func(); // calls function sub\func()
namespace\cname::method(); // calls static method "method" of class cname
$a = new namespace\sub\cname(); // instantiates object of class sub\cname
$b = namespace\CONSTANT; // assigns value of constant CONSTANT to $b
?>

menggunakan ruang nama :Alias/Import

Sokongan ruang nama PHP mempunyai dua cara menggunakan alias atau import: menggunakan alias untuk nama kelas atau menggunakan alias untuk nama ruang nama. Ambil perhatian bahawa PHP tidak menyokong fungsi atau pemalar yang diimport.

Dalam PHP, alias dilaksanakan melalui penggunaan operator Berikut ialah contoh menggunakan ketiga-tiga kaedah import yang mungkin:

1. Gunakan operator untuk mengimport/menggunakan alias

<?php
namespace foo;
use My\Full\Classname as Another;
 
// 下面的例子與 use My\Full\NSname as NSname 相同
use My\Full\NSname;
 
// 導(dǎo)入一個(gè)全局類
use \ArrayObject;
 
$obj = new namespace\Another; // 實(shí)例化 foo\Another 對(duì)象
$obj = new Another; // 實(shí)例化 My\Full\Classname 對(duì)象
NSname\subns\func(); // 調(diào)用函數(shù) My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 實(shí)例化 ArrayObject 對(duì)象
// 如果不使用 "use \ArrayObject" ,則實(shí)例化一個(gè) foo\ArrayObject 對(duì)象
?>

2. Satu baris mengandungi berbilang pernyataan penggunaan

<?php
use My\Full\Classname as Another, My\Full\NSname;
 
$obj = new Another; // 實(shí)例化 My\Full\Classname 對(duì)象
NSname\subns\func(); // 調(diào)用函數(shù) My\Full\NSname\subns\func
?>

Operasi import dilaksanakan semasa penyusunan, tetapi nama kelas dinamik, nama fungsi atau nama tetap tidak.

3. Import dan nama dinamik

<?php
use My\Full\Classname as Another, My\Full\NSname;
 
$obj = new Another; // 實(shí)例化一個(gè) My\Full\Classname 對(duì)象
$a = 'Another';
$obj = new $a;      // 實(shí)際化一個(gè) Another 對(duì)象
?>

Selain itu, operasi import hanya mempengaruhi nama yang tidak layak dan nama yang layak. Nama yang layak sepenuhnya tidak terjejas oleh import kerana ia bersifat deterministik.

4. Import dan nama yang layak sepenuhnya

<?php
use My\Full\Classname as Another, My\Full\NSname;
 
$obj = new Another; // instantiates object of class My\Full\Classname
$obj = new \Another; // instantiates object of class Another
$obj = new Another\thing; // instantiates object of class My\Full\Classname\thing
$obj = new \Another\thing; // instantiates object of class Another\thing
?>

Menggunakan ruang nama: sandaran fungsi/pemalar global

Dalam ruang nama, apabila PHP menemui kelas, fungsi atau nama tetap yang tidak layak, ia menggunakan strategi keutamaan yang berbeza untuk menyelesaikan nama. Nama kelas sentiasa diselesaikan kepada nama dalam ruang nama semasa. Oleh itu, apabila mengakses nama kelas di dalam sistem atau tidak termasuk dalam ruang nama, anda mesti menggunakan nama yang layak sepenuhnya, contohnya:

1 Akses kelas global dalam ruang nama

<?php
namespace A\B\C;
class Exception extends \Exception {}
 
$a = new Exception('hi'); // $a 是類 A\B\C\Exception 的一個(gè)對(duì)象
$b = new \Exception('hi'); // $b 是類 Exception 的一個(gè)對(duì)象
 
$c = new ArrayObject; // 致命錯(cuò)誤, 找不到 A\B\C\ArrayObject 類
?>

Untuk fungsi dan Untuk pemalar, jika fungsi atau pemalar tidak wujud dalam ruang nama semasa, PHP akan kembali menggunakan fungsi atau pemalar dalam ruang global.

2. Fungsi/pemalar global disandarkan dalam ruang nama

<?php
namespace A\B\C;
 
const E_ERROR = 45;
function strlen($str)
{
    return \strlen($str) - 1;
}
 
echo E_ERROR, "\n"; // 輸出 "45"
echo INI_ALL, "\n"; // 輸出 "7" - 使用全局常量 INI_ALL
 
echo strlen('hi'), "\n"; // 輸出 "1"
if (is_array('hi')) { // 輸出 "is not array"
    echo "is array\n";
} else {
    echo "is not array\n";
}
?>

Ruang global

Jika tiada ruang nama ditakrifkan, semua kelas dan fungsi ditakrifkan dalam ruang global, sama seperti sebelum PHP memperkenalkan konsep ruang nama. Awalan nama menunjukkan bahawa nama itu berada dalam ruang global, walaupun nama itu berada dalam ruang nama lain.

Menggunakan arahan ruang global

<?php
namespace A\B\C;
 
/* 這個(gè)函數(shù)是 A\B\C\fopen */
function fopen() {
     /* ... */
     $f = \fopen(...); // 調(diào)用全局的fopen函數(shù)
     return $f;
}
?>

Turutan ruang nama

Memandangkan terdapat ruang nama Selepas itu, perkara yang paling terdedah kepada ralat ialah apabila menggunakan kelas, apakah laluan carian untuk kelas ini.

<?php
namespace A;
use B\D, C\E as F;
 
// 函數(shù)調(diào)用
 
foo();      // 首先嘗試調(diào)用定義在命名空間"A"中的函數(shù)foo()
            // 再嘗試調(diào)用全局函數(shù) "foo"
 
\foo();     // 調(diào)用全局空間函數(shù) "foo"
 
my\foo();   // 調(diào)用定義在命名空間"A\my"中函數(shù) "foo"
 
F();        // 首先嘗試調(diào)用定義在命名空間"A"中的函數(shù) "F"
            // 再嘗試調(diào)用全局函數(shù) "F"
 
// 類引用
 
new B();    // 創(chuàng)建命名空間 "A" 中定義的類 "B" 的一個(gè)對(duì)象
            // 如果未找到,則嘗試自動(dòng)裝載類 "A\B"
 
new D();    // 使用導(dǎo)入規(guī)則,創(chuàng)建命名空間 "B" 中定義的類 "D" 的一個(gè)對(duì)象
            // 如果未找到,則嘗試自動(dòng)裝載類 "B\D"
 
new F();    // 使用導(dǎo)入規(guī)則,創(chuàng)建命名空間 "C" 中定義的類 "E" 的一個(gè)對(duì)象
            // 如果未找到,則嘗試自動(dòng)裝載類 "C\E"
 
new \B();   // 創(chuàng)建定義在全局空間中的類 "B" 的一個(gè)對(duì)象
            // 如果未發(fā)現(xiàn),則嘗試自動(dòng)裝載類 "B"
 
new \D();   // 創(chuàng)建定義在全局空間中的類 "D" 的一個(gè)對(duì)象
            // 如果未發(fā)現(xiàn),則嘗試自動(dòng)裝載類 "D"
 
new \F();   // 創(chuàng)建定義在全局空間中的類 "F" 的一個(gè)對(duì)象
            // 如果未發(fā)現(xiàn),則嘗試自動(dòng)裝載類 "F"
 
// 調(diào)用另一個(gè)命名空間中的靜態(tài)方法或命名空間函數(shù)
 
B\foo();    // 調(diào)用命名空間 "A\B" 中函數(shù) "foo"
 
B::foo();   // 調(diào)用命名空間 "A" 中定義的類 "B" 的 "foo" 方法
            // 如果未找到類 "A\B" ,則嘗試自動(dòng)裝載類 "A\B"
 
D::foo();   // 使用導(dǎo)入規(guī)則,調(diào)用命名空間 "B" 中定義的類 "D" 的 "foo" 方法
            // 如果類 "B\D" 未找到,則嘗試自動(dòng)裝載類 "B\D"
 
\B\foo();   // 調(diào)用命名空間 "B" 中的函數(shù) "foo"
 
\B::foo();  // 調(diào)用全局空間中的類 "B" 的 "foo" 方法
            // 如果類 "B" 未找到,則嘗試自動(dòng)裝載類 "B"
 
// 當(dāng)前命名空間中的靜態(tài)方法或函數(shù)
 
A\B::foo();   // 調(diào)用命名空間 "A\A" 中定義的類 "B" 的 "foo" 方法
              // 如果類 "A\A\B" 未找到,則嘗試自動(dòng)裝載類 "A\A\B"
 
\A\B::foo();  // 調(diào)用命名空間 "A\B" 中定義的類 "B" 的 "foo" 方法
              // 如果類 "A\B" 未找到,則嘗試自動(dòng)裝載類 "A\B"
?>

Leraian nama mengikut peraturan berikut:

1 Panggilan ke fungsi, kelas dan pemalar dengan nama yang layak sepenuhnya diselesaikan pada masa penyusunan. Sebagai contoh, AB baharu memutuskan ke kelas AB.

2. Semua nama yang tidak layak dan nama yang layak (nama tidak layak sepenuhnya) ditukar pada masa penyusunan mengikut peraturan import semasa. Sebagai contoh, jika ruang nama ABC diimport sebagai C, maka panggilan ke CDe() akan ditukar kepada ABCDe().

3. Dalam ruang nama, semua nama yang layak yang tidak ditukar mengikut peraturan import akan mempunyai nama ruang nama semasa di hadapannya. Sebagai contoh, jika CDe() dipanggil dalam ruang nama AB, CDe() akan ditukar kepada ABCDe().

4. Nama kelas yang tidak layak ditukar pada masa penyusunan mengikut peraturan import semasa (nama penuh digunakan dan bukannya nama import pendek). Sebagai contoh, jika ruang nama ABC diimport sebagai C, maka C() baharu ditukar kepada ABC() baharu.

5. Dalam ruang nama (mis. AB), panggilan fungsi kepada nama yang tidak layak diselesaikan pada masa jalan. Contohnya, panggilan ke fungsi foo() dihuraikan seperti ini:

1 Cari fungsi bernama ABfoo() dalam ruang nama semasa

2 () di angkasa.

6. Panggilan ke nama yang tidak layak atau kelas nama yang layak (nama tidak layak sepenuhnya) dalam ruang nama (mis. AB) diselesaikan pada masa jalan. Berikut ialah proses penghuraian untuk memanggil C() baharu dan DE() baharu: Penghuraian C() baharu:

1. Cari kelas ABC dalam ruang nama semasa.

2. Cuba muatkan kelas ABC secara automatik.

Analisis DE() baharu:

3 Tambahkan nama ruang nama semasa di hadapan nama kelas untuk menjadi: ABDE, dan kemudian cari kelas.

4. Cuba muatkan kelas ABDE secara automatik.

Untuk merujuk kepada kelas global dalam ruang nama global, nama C() yang layak sepenuhnya mesti digunakan.


Meneruskan pembelajaran
||
< ?php namespace MyProject1; // MyProject1 命名空間中的PHP代碼 namespace MyProject2; // MyProject2 命名空間中的PHP代碼 // 另一種語(yǔ)法 namespace MyProject3 { // MyProject3 命名空間中的PHP代碼 } ?>