PHP学习 之 namespace

本文的示例代码参考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

你可能感兴趣的:(PHP学习 之 namespace)