最近我读到了名称空间以及它们如何有益.我目前正在Laravel中创建一个项目,并试图从类地图自动加载转移到命名空间.但是,我似乎无法掌握PSR-0和PSR-4之间的实际差异.
我读过的一些资源是......
我的理解:
可以理解解释差异的例子.
我正在尝试用Composer设置PSR-4,但我刚刚开始 A non-empty PSR-4 prefix must end with a namespace separator.
我autoload
的composer.json
看起来像这样:
"autoload": {
"psr-4": {
"Acme\\models" : "app/models"
}
},
Run Code Online (Sandbox Code Playgroud)
app/models
是空的.
我究竟做错了什么?我怎样才能解决这个问题?
我知道你可以使用PSR标准来定位文件,或者告诉作曲家一个目录来扫描类.该文档建议使用PSR-4标准.作曲家还可以选择创建优化的自动加载器,它基本上可以生成完整的类图.那么,如果加载的最佳方式是使用类图,为什么要使用PSR-4呢?
保持目录结构对我来说是有意义的,因为这是一种很好的组织方式.但是,似乎逻辑选项是在开发机器上使用PSR-4加载,然后在生产环境中使用类映射.这样,您不必在每次创建新类时都重建类图,但生产环境会在部署过程中创建一个完整的类,而无需额外调用
./composer.phar dump-autoload -o
Run Code Online (Sandbox Code Playgroud) 我尝试使用作曲家自动加载,但出现此错误
作曲家.json
{
"autoload":{
"psr-4":{
"App\\":"app/"
},
"files": ["app/functions/helper.php"]
},
"require": {
"vlucas/phpdotenv": "^2.4",
"altorouter/altorouter": "^1.2",
"philo/laravel-blade": "^3.1"
},
"config":{
"optimize-autoloader":true
}
}
Run Code Online (Sandbox Code Playgroud)
我的终端输出
Generating optimized autoload files
Class App\Controllers\BaseController located in D:/php/Xamp/htdocs/MVC_PHP/app\controllers\BaseController.php does not comply with psr-4 autoloading standard. Skipping.
Class App\Controllers\IndexControllers located in D:/php/Xamp/htdocs/MVC_PHP/app\controllers\IndexControllers.php does not comply with psr-4 autoloading standard. Skipping.
Class App\RoutingDispatcher located in D:/php/Xamp/htdocs/MVC_PHP/app\routing\RoutingDispatcher.php does not comply with psr-4 autoloading standard. Skipping.
Generated optimized autoload files containing 508 classes
Run Code Online (Sandbox Code Playgroud) 关于Laravel,我有一个关于Composer自动加载的问题,即"psr-4"和"classmap"自动加载之间的区别.
我知道的一个区别是PSR-4不需要dumpautoload
为每个更改或添加新文件重复,而classmap需要dumpautoload
包含类或在指定目录中添加新文件的现有文件中的每个更改.
是否可以在同一个文件夹中使用同一名称空间下的多个类?我想做这样的事情:
<?php
namespace MyNamespace\Helpers\Exceptions
use Exception;
class CustomException1 extends Exception{}
class CustomException2 extends Exception{}
class CustomException3 extends Exception{}
Run Code Online (Sandbox Code Playgroud)
避免为每个自定义异常类使用一个文件.问题是,当我尝试在另一个类中使用其中一个自定义异常时,
use MyNamespace\Helpers\Exceptions\CustomException1;
Run Code Online (Sandbox Code Playgroud)
找不到CustomException1类.有任何想法吗?
我用composer的自动加载类系统运行一个portail:
"autoload": {
"psr-4": {
"Portal\\": "src/"
}
}
Run Code Online (Sandbox Code Playgroud)
它在我运行时有效composer.phar dump -o
,例如我的类Boostrap被很好地引用到vendor/composer/autoload_classmap.php
文件中:
'Portal\\Core\\Bootstrap' => $baseDir . '/src/core/Bootstrap.php',
Run Code Online (Sandbox Code Playgroud)
但是当我没有在自动加载转储上运行优化选项时,自动加载系统不再起作用了:
Fatal error: Class 'Portal\Core\Bootstrap' not found in /var/www/portail/prod/web/index.php on line 7
Run Code Online (Sandbox Code Playgroud)
如何在没有-o
选项的情况下进行自动加载?
我试图接受一年后在学校开发的laravel项目,我遇到了一些问题.在我的托管服务的服务器上上传整个项目后,我在浏览器和SSH shell上都出现了这些错误.
致命错误:/home/clients/ffa41f94063541f86a0fe6602a73caa1/myforms/vendor/laravel/framework/src/Illuminate/Container/Container.php:779未捕获的异常'ReflectionException',消息'Class App\Http\Kernel'不存在'堆栈跟踪:#0 /home/clients/ffa41f94063541f86a0fe6602a73caa1/myforms/vendor/laravel/framework/src/Illuminate/Container/Container.php(779):ReflectionClass - > __ construct('App\Http\Kernel')#1/home/clients /ffa41f94063541f86a0fe6602a73caa1/myforms/vendor/laravel/framework/src/Illuminate/Container/Container.php(659):Illuminate\Container\Container-> build('App\Http\Kernel',Array)#2/home/clients/ffa41f94063541f86a0fe6602a73caa1/myforms/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(644):Illuminate\Container\Container-> make('App\Http\Kernel',Array)#3/home/clients/ffa41f94063541f86a0fe6602a73caa1 /myforms/vendor/laravel/framework/src/Illuminate/Container/Container.php(229):Illuminate\Foundation\Application-> make('App\Http\Kernel',Array)位于779行的/home/clients/ffa41f94063541f86a0fe6602a73caa1/myforms/vendor/laravel/framework/src/Illuminate/Container/Container.php中的#4/home/clients/ffa41f94063
我认为它可能与我的命名空间配置有关,因为我还没有完全理解.
这是我的composer.json文件:
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"laravel/framework": "5.0.*",
"illuminate/html": "5.*",
"barryvdh/laravel-dompdf": "0.5.*",
"guzzlehttp/guzzle": "~4.0"
},
"require-dev": {
"phpunit/phpunit": "~4.0",
"phpspec/phpspec": "~2.1"
},
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "myforms/app/"
}
},
"autoload-dev": {
"classmap": [
"tests/TestCase.php"
]
},
"scripts": {
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-update-cmd": [ …
Run Code Online (Sandbox Code Playgroud)我想将Checkout SDK与Yii2 一起使用,但由于该库不支持PSR-4标准(命名空间),因此无法集成它.如何将此库用于我的目的?
编辑
正如我所建议的那样,我试着用class作为
$sale = new \Twocheckout_Sale();
Run Code Online (Sandbox Code Playgroud)
但我仍然无法使其发挥作用.
我有我的项目结构:
src/
?? Model/
?? User.php
Run Code Online (Sandbox Code Playgroud)
我的User.php文件如下所示:
<?php
namespace Bix\Model;
class User {
Run Code Online (Sandbox Code Playgroud)
我的composer.json自动加载器是这样的:
"autoload": {
"psr-4": {
"Bix\\": "src/"
}
}
Run Code Online (Sandbox Code Playgroud)
最后我的bootstrap.php是这样的:
use Bix\Model\User;
// PSR-4 Autoloader.
require_once "vendor/autoload.php";
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试创建一个new User()
,我会收到错误Fatal error: Class 'User' not found in /var/www/public/api/v1/index.php on line 8
看一下作曲家autoload_psr4.php文件看起来没问题:
// Autoload_psr4.php由Composer生成
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname(dirname($vendorDir));
return array(
'XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'),
'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
'KeenIO\\' => array($vendorDir . '/keen-io/keen-io/src'),
'Bix\\' => array($baseDir . '/src'),
);
Run Code Online (Sandbox Code Playgroud)
任何人都可以指出我上面的错误吗?
psr-4 ×10
composer-php ×7
php ×7
autoload ×4
namespaces ×3
laravel ×2
psr-0 ×2
2checkout ×1
oop ×1
yii2 ×1