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 Superglobals 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 # وجافا، مساحة ليست أي شيء من الأشياء الجديدة. ولكن في 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 \ الفرعية \ مستوى \ CONNECT_OK، اكتب MyProject \ الفرعية \ مستوى \ اتصال وظيفة MyProject \ الفرعية \ مستوى \ اتصال.


مساحات

يمكن الرجوع إليها PHP اسم الطبقة مساحة في ثلاث طرق:

  1. اسم غير مؤهلين، أو اسم الفئة لا يحتوي على البادئة، مثل $ ل= فو جديد ()؛ أو فو :: staticmethod ()؛ إذا كانت مساحة الاسم الحالي هو currentnamespace، سيتم تفسير فو كما currentnamespace \ فو. إذا فو هو رمز عالمي، رمز لا يحتوي على أي مساحة، سيتم توزيعه كما فو فو. تحذير: إذا لم يتم تعريف وظيفة مساحة أو ثابت، ثم سيتم حل اسم الدالة أو اسم ثابت غير مؤهلين لاسم الدالة العالمي، أو اسم ثابت.

  2. اسم مؤهل، أو الاسم يحتوي على البادئة، مثل $ ل= جديد subnamespace \ فو ( )؛ أو subnamespace \ فو :: staticmethod ()؛ إذا كانت مساحة الاسم الحالي هو currentnamespace، ثم فو سيتم تحليل كما currentnamespace \ subnamespace \ فو. إذا فو هو رمز عالمي، رمز لا يحتوي على أي مساحة، سيتم حلها فو لsubnamespace \ فو.

  3. تماما اسم مؤهل، أو إدراج اسم المشغل بادئة العالمي، على سبيل المثال، أمريكي لل= جديد \ currentnamespace \ فو ()؛ أو \ currentnamespace \ فو :: staticmethod () ؛ في هذه الحالة، سوف يكون دائما حل فو إلى اسم كلمات رمزية (الحرفي الاسم) currentnamespace \ فو.

هنا هو مثيل من هذه الطرق الثلاث:

كود ملف 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 () أو \ استثناء أو \ 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
?>

يجب عليك استخدام اسم المؤهل بالكامل (بما في ذلك اسم فئة من بادئة مساحة الاسم). لاحظ أن لفي اسم الديناميكي الطبقة، اسم وظيفة، أو اسم ثابت، اسم مؤهل واسم مؤهل بشكل كامل لا فرق، وبالتالي فإن مائل مما يؤدي لا لزوم لها.

عنصر مساحة الوصول الديناميكي

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

استخدام النطاقات: التعرج / استيراد

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

تحليل اسم اتبع هذه القواعد:

  1. وظيفة اسم مؤهل بشكل كامل للطبقة ودعوات مستمرة حلها في وقت الترجمة. على سبيل المثال الجديد \ A \ B يقرر الدرجة A \ ب.
  2. جميع الأسماء غير المؤهلين والمؤهلات (لا أسماء مؤهلة تماما) تحويلها في وقت الترجمة على أساس قواعد استيراد الحالية. على سبيل المثال، إذا تم استيراد مساحة A \ B \ 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)، ويدعو إلى حل اسم وظيفة غير المشروط في وقت التشغيل. على سبيل المثال، وهي دعوة للعمل فو () يتم حل مثل هذه:
    1. البحث يسمى A \ B \ فو في مساحة الاسم الحالي () وظيفة
    2. في محاولة لايجاد والاتصال العالمي (جلوبل) وظيفة الفضاء فو ().
  6. مساحة الاسم (على سبيل المثال، A \ B) الداخلي لاسم غير مؤهلين أو مؤهلين للأسماء فئة يتم حل (لا أسماء مؤهلة تماما) الدعوة في وقت التشغيل. هنا هو الدعوة إلى الجديد C () والجديد D \ E () من عملية حل: C () إعراب الجديد:
    1. البحث A \ B الطبقة \ C في مساحة الاسم الحالي.
    2. يحاول autoload A \ B \ C.
    جديد D \ E () الاعراب:
    1. في يصبح اسم الطبقة يسبقه اسم مساحة الاسم الحالي: A \ B \ D \ E ، ثم ننظر للفئة.
    2. يحاول autoload A \ B \ D \ E.
    مرجع الطبقة العالمية مساحة العالمية، يجب عليك استخدام اسم مؤهل جديد \ C ().