本文的示例代码参考namespace
目录
开始
命名冲突
命名空间
全局空间
-
引用规则
非限定名称
限定名称
完全限定名称
引用别名
-
自动加载
PSR-0
PSR-4
classmap
files
开始
mkdir -p vendor/lib1 && vim vendor/lib1/Person.php
name = $name;
$this->age = $age;
}
}
PHP语法参考 X分钟速成Y - 其中 Y=PHP
vim startup.php
php startup.php
__construct of lib1/Person.php
object(Person)#1 (2) {
["name"]=>
string(5) "David"
["age"]=>
int(6)
}
PHP环境搭建参考 PHP学习 之 autoload
命名冲突
mkdir -p vendor/lib2 && vim vendor/lib2/Person.php
name = $name;
$this->age = $age;
}
}
vim conflict.php
php conflict.php
PHP Fatal error: Cannot declare class Person, because the name is already in use in /Users/yuanlin/Workspace/php-tutorial/namespace/vendor/lib2/Person.php on line 2
命名空间
- vendor/lib1/Person.php
vim vendor/lib1/Person.php
name = $name;
$this->age = $age;
}
}
echo "namespace: ". __NAMESPACE__ . "\n";
php vendor/lib1/Person.php
namespace: lib1
常量
__NAMESPACE__
的值是包含当前命名空间名称的字符串
- vendor/lib2/Person.php
vim vendor/lib2/Person.php
name = $name;
$this->age = $age;
}
}
echo "namespace: ". __NAMESPACE__ . "\n";
php vendor/lib2/Person.php
namespace: lib2
- namespace.php
vim namespace.php
php namespace.php
namespace: lib1
namespace: lib2
__construct of lib1/Person.php
object(lib1\Person)#1 (2) {
["name"]=>
string(5) "David"
["age"]=>
int(6)
}
__construct of lib2/Person.php
object(lib2\Person)#2 (2) {
["name"]=>
string(5) "David"
["age"]=>
int(6)
}
namespace:
在全局的即不包括在任何命名空间中的代码 常量
__NAMESPACE__
的值是包含一个空的字符串
全局空间
在名称前加上前缀\表示该名称是全局空间中的名称
vim global.php
php global.php
3
3
引用规则
非限定名称
vim regular_1.php
php regular_1.php
PHP Fatal error: Uncaught Error: Class 'app\Person' not found in /Users/yuanlin/Workspace/php-tutorial/namespace/regular_1.php:8
非限定名称引用: current namespace + 非限定名称
PS: 非限定名称的详细定义参考 使用命名空间:基础
限定名称
vim regular_2.php
php regular_2.php
PHP Fatal error: Uncaught Error: Class 'app\lib1\Person' not found in /Users/yuanlin/Workspace/php-tutorial/namespace/regular_2.php:8
限定名称引用: current namespace + 限定名称
完全限定名称
vim regular_3.php
php regular_3.php
__construct of lib1/Person.php
object(lib1\Person)#1 (2) {
["name"]=>
string(5) "David"
["age"]=>
int(6)
}
完全限定名称引用: 完全限定名称
引用别名
vim alias.php
php alias.php
__construct of lib1/Person.php
自动加载
PSR-0
PSR (PHP Standards Recommendations)
FIG (PHP Framework Interop Group) - Moving PHP forward through collaboration and standards
Deprecated - As of 2014-10-21 PSR-0 has been marked as deprecated. PSR-4 is now recommended
as an alternative
PSR-4
mkdir -p autoload/psr4 && cd autoload/psr4
vim composer.json
{
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
}
mkdir -p app/Core && vim app/Core/Request.php
composer update
vim psr4.php
php psr4.php
namespace: App\Core
__construct of App\Core\Request.php
classmap
cd ../..
mkdir -p autoload/classmap && cd autoload/classmap
vim composer.json
{
"autoload": {
"classmap": [
"app"
]
}
}
mkdir -p app/Core && vim app/Core/Request.php
composer update
vim classmap.php
php psr4.php
namespace: App\Core
__construct of App\Core\Request.php
classmap与PSR-4这两种autoload方式有何区别?
files
cd ../..
mkdir -p autoload/files && cd autoload/files
vim composer.json
{
"autoload": {
"files": [
"app/Core/Request.php"
]
}
}
mkdir -p app/Core && vim app/Core/Request.php
composer update
vim files.php
php files.php
namespace: App\Core
__construct of App\Core\Request.php
files这种autoload方式的应用场景?
参考
PHP: 命名空间
PHP编码规范(中文版)导读
PSR-4——新鲜出炉的PHP规范
PHP自动加载规范PSR-4
php - 在 Composer 中,如果classmap实际速度较快,那么为什么要使用 PSR 0或者 PSR 4自动加载?
深入 Composer autoload