Latest web development tutorials
×

PHP курс

PHP курс PHP Краткое введение PHP устанавливать PHP грамматика PHP переменная PHP echo/print PHP Типы данных PHP постоянная PHP строка PHP операторы PHP If...Else PHP Switch PHP массив PHP Сортировка массива PHP Суперглобальные PHP While циркуляция PHP For циркуляция PHP функция PHP Магические Переменные PHP Пространства имен PHP Объектно-ориентированный

PHP форма

PHP форма PHP Аутентификация с помощью форм PHP форма - Обязательные для заполнения поля PHP форма - Проверка электронной почты и URL PHP Полный экземпляр формы PHP $_GET переменная PHP $_POST переменная

PHP Расширенный учебник

PHP Многомерные Массивы PHP дата PHP содержать PHP файл PHP Загрузка файлов PHP Cookie PHP Session PHP E-mail PHP безопасности E-mail PHP Error PHP Exception PHP фильтр PHP Расширенный фильтр PHP JSON

PHP 7 Новые возможности

PHP 7 Новые возможности

PHP база данных

PHP MySQL Краткое введение PHP MySQL подключение PHP MySQL Создание базы данных PHP MySQL Создание таблицы данных PHP MySQL Вставка данных PHP MySQL Вставка нескольких данных PHP MySQL Подготовленные выражения PHP MySQL Считывание данных PHP MySQL WHERE PHP MySQL ORDER BY PHP MySQL UPDATE PHP MySQL DELETE PHP ODBC

PHP XML

XML Expat Parser XML DOM XML SimpleXML

PHP & AJAX

AJAX Краткое введение AJAX PHP AJAX база данных AJAX XML AJAX Поиск в реальном времени AJAX RSS Reader AJAX голосование

PHP справочное руководство

PHP Array PHP Calendar PHP cURL PHP Date PHP Directory PHP Error PHP Filesystem PHP Filter PHP FTP PHP HTTP PHP Libxml PHP Mail PHP Math PHP Misc PHP MySQLi PHP PDO PHP SimpleXML PHP String PHP XML PHP Zip PHP Timezones PHP обработка изображений PHP RESTful

PHP пространства имен (имен)

PHP пространства имен (имен) добавляется в PHP 5.3, если вы узнали, C # и Java, пространство имен, что нет ничего нового. Но в PHP, который до сих пор имеет очень важное значение.

PHP Пространства имен может решить следующие две задачи:

  1. Пользователь написанный код внутри PHP классов / функций / констант или конфликтов сторонних классов / функций / Константы имен между ними.
  2. В длинных имен идентификаторов (как правило, для облегчения первой категории, определенной) создать псевдоним (или короткий) имя улучшения читаемости исходного кода.

Определение пространств имен

По умолчанию, все константы, классы и имена функций помещаются в глобальном пространстве, точно так же, как и до поддержки пространства имен PHP.

Пространство имен декларации по ключевому слову пространства имен. Если имя файла содержит пробелы, то он должен объявить пространство имен перед любым другим кодом. Синтаксис выглядит следующим образом;

< ?php  
// 定义代码在 'MyProject' 命名空间中  
namespace MyProject;  
 
// ... 代码 ...  

Вы также можете определить различные пространства имен в том же файле в коде, такие как:

< ?php  
namespace MyProject1;  
// MyProject1 命名空间中的PHP代码  
 
namespace MyProject2;  
// MyProject2 命名空间中的PHP代码    
 
// 另一种语法
namespace MyProject3 {  
 // MyProject3 命名空间中的PHP代码    
}  
?>  

Прежде чем объявить пространство имен уникальный юридический код используется для определения исходного файла методы кодирования объявить заявление. Все не-PHP-код включает в себя пробелы не могут появляться до объявления пространства имен.

<?php
declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码
namespace MyProject {

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

namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>

Следующая ошибка синтаксиса кода будет происходить:

<html>
<?php
namespace MyProject; // 命名空间前出现了“<html>” 会致命错误 - 命名空间必须是程序脚本的第一条语句
?>

Subnamespaces

Связь с каталогами и файлами так же, как, PHP Пространства имен также позволяет указать имя иерархическое пространство имен. Таким образом, имя пространства имен может быть определено с помощью иерархически:

<?php
namespace MyProject\Sub\Level;  //声明分层次的单个命名空间

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

?>

Приведенный выше пример создает постоянную MyProject \ \ Sub Level \ CONNECT_OK, тип MyProject \ Sub \ Level \ Подключение и функция MyProject \ Sub \ Level \ Connect.


Пространства имен

PHP имя класса пространства имен можно ссылаться тремя способами:

  1. Неквалифицированное имя, или имя класса не содержит префикс, например, $ а = новый Foo () или Foo :: STATICMETHOD ();. Если текущее пространство имен currentnamespace, Foo будет интерпретироваться как currentnamespace \ Foo. Если Foo является глобальный код, код не содержит каких-либо имен, оно будет разобрано как Foo Foo. Внимание: Если функция имен или константа не определена, то имя функции или неквалифицированное имя константы будут решены к глобальному имени функции или постоянное имя.

  2. Квалифицированное имя, или имя содержит префикс, например, $ а = новый подпространстве имен \ Foo ( ), или подпространстве имен \ Foo :: STATICMETHOD ();. Если текущее пространство имен currentnamespace, то Foo будет разобрано как currentnamespace \ подпространстве имен \ Foo. Если Foo является глобальный код, код не содержит каких-либо имен, Foo будет разрешен к подпространстве имен \ Foo.

  3. Полное имя, или включать в себя глобальное имя оператора префикс, например, $ а = новый \ currentnamespace \ Foo (); или \ currentnamespace \ Foo :: STATICMETHOD () ;. В этом случае Foo всегда будет решена с именем кодовых слов (буквальное название) currentnamespace \ Foo.

Вот пример из этих трех способов:

file1.php файл кода

<?php
namespace Foo\Bar\subnamespace; 

const FOO = 1;
function foo() {}
class foo
{
    static function staticmethod() {}
}
?>

file2.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的静态方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO

/* 限定名称 */
subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,
                                  // 以及类的方法 staticmethod
echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO
                                  
/* 完全限定名称 */
\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO
?>

Обратите внимание, что для доступа к любому глобальному класса, функции или константы, вы можете использовать полное имя, например, \ StrLen () или \ Exception или \ INI_ALL.

Пространство имен Доступ к глобальным классов, функций и констант:

<?php
namespace Foo;

function strlen() {}
const INI_ALL = 3;
class Exception {}

$a = \strlen('hi'); // 调用全局函数strlen
$b = \INI_ALL; // 访问全局常量 INI_ALL
$c = new \Exception('error'); // 实例化全局类 Exception
?>

Пространства имен и динамические особенности языка

Реализация PHP имен пострадавших от собственных динамических особенностей языка. Итак, если вы хотите следующий код в пространствах имен, элементы динамического доступа.

example1.php код файла:

<?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
?>

Вы должны использовать полное имя (включая имя класса префикса пространства имен). Обратите внимание, что, поскольку в имени динамического класса, имени функции или постоянное имя, уточненное имя и полное имя нет никакой разницы, поэтому ведущий обратный слеш не нужен.

Элемент пространства имен Dynamic Access

<?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
?>

Пространство имен ключевых слов и константы __NAMESPACE__

PHP поддерживает два способа доступа текущего пространства имен абстрактных элементов интерьера, __ NAMESPACE__ Магические константы и пространства имен ключевое слово.

__NAMESPACE__ Постоянное значение является строкой, содержащей имя текущего пространства имен. В глобальном, код не включает в себя пространство имен, которое содержит пустую строку.

__NAMESPACE__ Например, в коде пространства имен

<?php
namespace MyProject;

echo '"', __NAMESPACE__, '"'; // 输出 "MyProject"
?>

__NAMESPACE__ Пример, глобальный код

<?php

echo '"', __NAMESPACE__, '"'; // 输出 ""
?>

Константа __NAMESPACE__ создается динамически, когда имя полезно, например:

Используйте __NAMESPACE__ динамически создаваемых имя

<?php
namespace MyProject;

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

Пространство имен можно использовать ключевое слово явным образом получить доступ к текущему пространству имен или суб-пространств имен элементов. Это эквивалентно классу собственного оператора.

Пространство имен кода оператора пространства имен

<?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
?>

Оператор пространства имен, глобальный код

<?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
?>

Использование пространств имен: Aliasing / Импорт

PHP Пространства имен поддерживают два используя псевдонимы или импорта: Используйте псевдоним для имени класса или псевдоним для имени пространства имен. Обратите внимание, что PHP не поддерживает импорт функции или константы.

В PHP, псевдоним для использования оператора для достижения следующих является использование всех возможных способов импортировать три примера:

1, используя использование оператора импорта / псевдоним

<?php
namespace foo;
use My\Full\Classname as Another;

// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 导入一个全局类
use \ArrayObject;

$obj = new namespace\Another; // 实例化 foo\Another 对象
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
?>

2, строка, которая содержит несколько операторов использования

<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
?>

Операция импорта выполняется во время компиляции, но имя динамический класс, имя функции, или имя константы нет.

3, Импорт и динамическое имя

<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化一个 My\Full\Classname 对象
$a = 'Another';
$obj = new $a;      // 实际化一个 Another 对象
?>

Кроме того, операция импорта влияет только на неквалифицированные и квалифицированные имена. Полное имя, потому что он идентифицируется, оно не зависит от импорта.

4, импортирующих и полные имена

<?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
?>

Использование пространств имен: Откат к глобальной функции / константы

В пространстве имен, когда PHP встречает безоговорочную класс, функцию или постоянное имя, она использует различные приоритетные стратегии для разрешения имени. Имя класса текущего имени пространства имен всегда решает. Поэтому, во внутреннем доступа к системе или не входит в пространстве имен имя класса, вы должны использовать полное имя, например:

1, доступ к глобальным классам в пространстве имен

<?php
namespace A\B\C;
class Exception extends \Exception {}

$a = new Exception('hi'); // $a 是类 A\B\C\Exception 的一个对象
$b = new \Exception('hi'); // $b 是类 Exception 的一个对象

$c = new ArrayObject; // 致命错误, 找不到 A\B\C\ArrayObject 类
?>

Для функций и констант, функция не существует или, если текущие константы пространства имен, PHP будет вернуться к глобальным функциям или констант в пространстве.

2, функция глобального пространства имен зарезервировано / константы

<?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";
}
?>

Глобальное пространство

Если вы не определите пространство имен, все определения и функции класса находятся в глобальном пространстве и PHP как до введения концепции пространств имен. Перед именем префикс \ указывает на то, что имя является глобальное пространство имен, это также справедливо и для других имен, даже если имя находится.

Описание Использовать глобальное пространство

<?php
namespace A\B\C;

/* 这个函数是 A\B\C\fopen */
function fopen() { 
     /* ... */
     $f = \fopen(...); // 调用全局的fopen函数
     return $f;
} 
?>

Пространство имен заказа

Так как с пространством имен, которая является наиболее подверженной ошибкам использование времени класса, чтобы найти путь этого класса является то, что.

<?php
namespace A;
use B\D, C\E as F;

// 函数调用

foo();      // 首先尝试调用定义在命名空间"A"中的函数foo()
            // 再尝试调用全局函数 "foo"

\foo();     // 调用全局空间函数 "foo" 

my\foo();   // 调用定义在命名空间"A\my"中函数 "foo" 

F();        // 首先尝试调用定义在命名空间"A"中的函数 "F" 
            // 再尝试调用全局函数 "F"

// 类引用

new B();    // 创建命名空间 "A" 中定义的类 "B" 的一个对象
            // 如果未找到,则尝试自动装载类 "A\B"

new D();    // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象
            // 如果未找到,则尝试自动装载类 "B\D"

new F();    // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象
            // 如果未找到,则尝试自动装载类 "C\E"

new \B();   // 创建定义在全局空间中的类 "B" 的一个对象
            // 如果未发现,则尝试自动装载类 "B"

new \D();   // 创建定义在全局空间中的类 "D" 的一个对象
            // 如果未发现,则尝试自动装载类 "D"

new \F();   // 创建定义在全局空间中的类 "F" 的一个对象
            // 如果未发现,则尝试自动装载类 "F"

// 调用另一个命名空间中的静态方法或命名空间函数

B\foo();    // 调用命名空间 "A\B" 中函数 "foo"

B::foo();   // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
            // 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"

D::foo();   // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法
            // 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"

\B\foo();   // 调用命名空间 "B" 中的函数 "foo" 

\B::foo();  // 调用全局空间中的类 "B" 的 "foo" 方法
            // 如果类 "B" 未找到,则尝试自动装载类 "B"

// 当前命名空间中的静态方法或函数

A\B::foo();   // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法
              // 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"

\A\B::foo();  // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法
              // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"
?>

Name Resolution следующие правила:

  1. Функция полное имя класса и постоянные звонки во время компиляции. Например новый \ A \ B решает класса A \ B.
  2. Все неквалифицированные и квалифицированные имена (не полностью квалифицированные имена) преобразуются во время компиляции на основе текущих правил импорта. Например, если пространство имен A \ B \ C импортируется как C, то вызов C \ D \ е () будут преобразованы в A \ B \ C \ D \ е ().
  3. Пространство имен внутри, все квалифицированные имена не переводятся в соответствии с правилами импорта будут добавлены к текущему имени пространства имен перед ним. Например, в пространстве имен A \ B Внутренний вызов C \ D \ е (), то C \ D \ е () транслируется в A \ B \ C \ D \ е ().
  4. Номера имя класса преобразователя (с полным именем вместо имени краткого введения) во время компиляции на основе текущих правил импорта. Например, если пространство имен A \ B \ C импортируется как C, новый C () преобразуются в новый A \ B \ C () .
  5. Пространство имен внутренней (например, A \ B), вызов неквалифицированных имя функции будет решена во время выполнения. Например, вызов функции Foo () решается следующим образом :
    1. Найти называется A \ B \ Foo в текущем пространстве имен () функция
    2. Постарайтесь найти и вызвать глобальную (глобальное) пространство функции Foo ().
  6. Пространство имен (например, A \ B) внутренней по отношению к неквалифицированным или квалифицированное имя имен классов (не полностью квалифицированные имена) вызов разрешен во время выполнения. Вот призыв к новым C () и новый D \ E () процесса урегулирования: новый C () синтаксический анализ:
    1. Найти A \ B класс \ C в текущем пространстве имен.
    2. Он пытается автозагрузку A \ B \ C.
    новый D \ E () синтаксический анализ:
    1. В имени класса предшествует текущее имя пространства имен становится: A \ B \ D \ E , а затем посмотреть на класс.
    2. Он пытается автозагрузку A \ B \ D \ E.
    Для ссылки на глобальное пространство имен глобального класса, необходимо использовать полное имя нового \ C ().