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 네임 스페이스 (공간)

당신은 C # 및 자바, 어떤 새로운 일을하지 네임 스페이스를 배운 경우 PHP 네임 스페이스 (네임 스페이스), PHP 5.3에 추가됩니다. 그러나 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>” 会致命错误 - 命名空间必须是程序脚本的第一条语句
?>

하위 네임 스페이스

디렉토리와 파일과의 관계는 훨씬처럼, PHP 네임 스페이스는 계층 적 이름 공간의 이름을 지정할 수 있습니다. 따라서, 공간의 이름은 계층 적 방식을 사용하여 정의 될 수있다 :

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

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

?>

위의 예는 일정에 MyProject의 \ 하위 \ 레벨을 생성 \ CONNECT_OK, 유형에 MyProject \ 하위 \ 수준 \ 연결 및 기능에 MyProject \ 하위 \ 수준 \에 연결합니다.


네임 스페이스

PHP 공간 클래스 이름은 세 가지 방법을 참조 할 수있다 :

  1. 또는 foo는 :: StaticMethod를 (); 규정되지 않은 이름 또는 클래스의 이름은 $ 같은 = 새로운 foo는 () 등을 접두사가 포함되어 있지 않습니다. 현재 네임 스페이스 currentnamespace 경우, foo는이 currentnamespace의 \ foo는 것으로 해석됩니다. 푸 글로벌 코드 인 경우, 코드는 임의의 네임 스페이스를 포함하지 않는, 그것은 푸 foo에로 분석한다. 주의 : 스페이스 기능 또는 상수가 정의되지 않으면, 함수 이름 또는 규정되지 않은 상수 이름 전역 함수 이름 또는 상수 이름으로 확인한다.

  2. 자격을 갖춘 이름, 또는 이름이 $로 = 새로운 subnamespace의 \ foo는 (접두사, 등을 포함 ) 또는 subnamespace의 \ foo는 :: StaticMethod를을 (). 현재 네임 스페이스 currentnamespace 경우, foo는이 currentnamespace의 \의 subnamespace의 \ foo에로 분석됩니다. foo는 글로벌 코드 인 경우, 코드 네임 스페이스를 포함하지 않는, foo는이 \ foo는을 subnamespace에 해결 될 것입니다.

  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 () 또는 \ 예외 또는 \ 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;
}
?>

namespace 키워드를 명시 적으로 현재 이름 공간 또는 서브 스페이스 요소에 액세스 할 수있다. 그것은 자기 연산자의 클래스에 해당합니다.

네임 스페이스 운영자 네임 스페이스 코드

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

또한, 가져 오기 작업은 규정되지 않은 자격을 갖춘 이름에 영향을 미친다. 이 식별되기 때문에 완전한 이름, 그것은 가져 오기의 영향을받지 않습니다.

네, 가져 오기 및 정규화 된 이름

<?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. 기능 클래스의 완전한 이름과 컴파일 시간에 해결 상수 통화. \의 B \ 새로운 예를 들어 A\ B로 해결
  2. 모든 규정되지 않은 및 규정 된 이름 (안 완전한 이름은) 현재 수입 규칙에 따라 컴파일 시간에 변환됩니다. 네임 스페이스 \ B \ C는 C로 가져올 경우, 예를 들어, C의 \ D의 \ 전자로의 호출 ()가 \의 B \의 C \ d 개 \의 변환됩니다 전자 ().
  3. 네임 스페이스는 내부, 수입 규칙에 따라 변환 모든 자격을 갖춘 이름은 그것의 앞에 현재의 네임 스페이스 이름에 추가됩니다. 예를 들어, 이름 공간에서 \ B 내부 통화 C \ d 개 \ 전자 (), 다음 C \ D \ 전자 ()가 \의 B \의 C \ d 개 \의 변환됩니다 전자 ().
  4. 현재 수입 규칙에 따라 컴파일시에 (이름 대신 간단한 소개의 이름으로) 컨버터의 비 클래스 이름. 네임 스페이스 \ B \ C는 C, 새로운 C로 수입되는 경우 예를 들어, () 새로 만들기 \ B \ C로 변환됩니다 () .
  5. 규정되지 않은 함수 이름 런타임에 해결에 네임 스페이스 (예 : \의 B 등) 내부는, 호출합니다. 예를 들어, ()의 호출은 다음과 같이 해결 foo는 작동합니다 :
    1. () 함수 현재 이름 공간에서 \ B 형 \ foo를 호출 찾기
    2. 찾아 전역 (전역) 공간 함수 foo를 호출하려고합니다 ().
  6. 네임 스페이스 (예를 들어, \의 B) 클래스 이름의 규정되지 않은 또는 정규화 된 이름 내부는 (안 완전한 이름) 호출은 런타임에 확인됩니다. 여기에 새로운 C 호출 () 및 확인 프로세스의 새로운 D의 \ E는 ()입니다 : 새로운 C () 구문 분석 :
    1. 현재 이름 공간에있는 \의 B \의 C 클래스를 찾을 수 있습니다.
    2. 그것은 자동로드 A를 \ B \ C로 시도
    새로운 D의 \의 E () 구문 분석 :
    1. 현재 네임 스페이스 이름 앞에 클래스 이름이됩니다 중 : \의 B \ d 개 \ E는 , 다음 클래스를 찾습니다.
    2. 그것은 B \ D \ E. \ 자동로드 A를 시도
    글로벌 네임 스페이스의 글로벌 클래스를 참조하려면, 당신은 완전한 이름의 새로운 \의 C를 사용해야합니다 ().