php 自动加载 大小写,php – 如何自动加载文件名与类名不同的类?

本文讨论了在PHP中如何处理类名与文件名不匹配导致的加载问题。作者提出了通过字符串操作和约定来解决这个问题,而不是直接重命名文件。他们分享了一个自定义的自动加载函数示例,该函数可以根据类名动态生成对应的文件路径。作者建议使用反映命名空间和类名的命名空间和文件名,并推荐使用Composer进行依赖管理和自动加载。
摘要由CSDN通过智能技术生成

我见过这些,

我可以改变但是在我的MV *结构中我有:

/models

customer.class.php

order.class.php

/controllers

customer.controller.php

order.controller.php

/views

...

在它们的实际课程中,

class CustomerController {}

class OrderController{}

class CustomerModel{}

class OrderModel{}

我试图与这些名字保持一致.如果我没有把类名后缀(Controller,Model),我无法加载该类,因为这是重新声明的.

如果我保留我的类的名称,自动加载会失败,因为它将查找名为的类文件

CustomerController

当文件名确实是,

customer.controller.php

是我唯一的方式(无序):

>使用create_alias

>重命名我的文件(customer.model.php到customermodel.php)

>重命名我的课程

>使用正则表达式

>使用包含文件的引导程序(包括,

require_once等)

示例代码,

function model_autoloader($class) {

include MODEL_PATH . $class . '.model.php';

}

spl_autoload_register('model_autoloader');

好像我要重命名文件,

“终止类名对应于以.php结尾的文件名.文件名必须与终止类名的大小写相匹配.”

解决方法:

在我看来,这可以通过一些基本的字符串操作和一些约定来处理.

define('CLASS_PATH_ROOT', '/');

function splitCamelCase($str) {

return preg_split('/(?<=\\w)(?=[A-Z])/', $str);

}

function makeFileName($segments) {

if(count($segments) === 1) { // a "model"

return CLASS_PATH_ROOT . 'models/' . strtolower($segments[0]) . '.php';

}

// else get type/folder name from last segment

$type = strtolower(array_pop($segments));

if($type === 'controller') {

$folderName = 'controllers';

}

else {

$folderName = $type;

}

$fileName = strtolower(join($segments, '.'));

return CLASS_PATH_ROOT . $folderName . '/' . $fileName . '.' . $type . '.php';

}

$classNames = array('Customer', 'CustomerController');

foreach($classNames as $className) {

$parts = splitCamelCase($className);

$fileName = makeFileName($parts);

echo $className . ' -> '. $fileName . PHP_EOL;

}

输出是

Customer -> /models/customer.php

CustomerController -> /controllers/customer.controller.php

您现在需要在自动加载器功能中使用makeFileName.

我自己强烈反对这样的事情.我会使用反映命名空间和类名的命名空间和文件名.我也用Composer.

(我发现了splitCamelCase here.)

标签:php,php-5-5,psr-4

来源: https://codeday.me/bug/20190708/1400203.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值