首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
320 阅读
2
php接口优化 使用curl_multi_init批量请求
167 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
116 阅读
4
2024年备考系统架构设计师
111 阅读
5
MySQL数据库SQLSTATE[22007]: Invalid datetime format 日期类型不能为空值的解决办法
110 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
59
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
786
篇与
的结果
2023-08-09
你所不知道 ❌ PHP 自动加载
你所不知道 ❌ PHP 自动加载前言很多的小伙伴在,学习 PHP 的时候最早面对的问题之一就是 require 、 include 和 require_once 、include_once 的相爱相杀。在了解了它们相爱相杀的故事后,往往就开始使用起了框架。框架固然是干活的好工具,但是你知道你平时 new 一个新类的时候,发生了什么吗?有想过为什么我们 遵循规范 就会自动的帮我们做好一切的加载吗? 让我们一切来探索发现其中的奥秘。时间线蒸汽时代在 PHP 代码的顶部你是不是经常看到这样的代码。require 'lionis.php';require 'is.php';require 'cool.php';如果只是引入几个 PHP 脚本,那还可以接受。那引入成千上万个脚本的时候,爆炸是在所难免的。如果对一个脚本改了个名字,还需要对引入改脚本的每个脚本改名,能不爆炸吗?连打出这段话都怎么绕。电气时代在 PHP 电气时代,开始出现了 __autoload 和 spl_autoload_register 函数注册自定义的自动加载策略。通俗的来说,__autoload 和 spl_autoload_register 是一个 杀手组织,他们会去雇佣 各国杀手 (函数)。当我们想搞定某个人的时候(new),只需要提供名字(类名),剩下的 杀手 会帮我们搞定的。__autoloadPHP 5 开始提供这个函数 传送门。当你使用的 类 找不到的时候,它把类名当成参数扔进这个函数。<?php// Lionis.phpclass Lionis {public function __construct() { echo '欧耶耶, 我就是 Lionis'; }}<?php// index.phpfunction __autoload($classname) {$filename = './' . $classname . '.php'; require_once $filename;}$lionis = new Lionis();输出欧耶耶, 我就是 Lionisspl_autoload_register如果我们 项目 很大很老又或者你是一个 爱折腾 的少先队员,需要引入的东西有不一样的规范,这时候如果都放在 __autoload 函数里,这个函数马上就会膨胀的。而且 __autoload 是全局唯一的,如果被人占用了,可能会导致错误。(欲使一个人灭亡,必将先使其膨胀。)PHP 5.1.2 开始提供这个函数 传送门,注册给定的函数作为 __autoload 的实现。所以,我们看一些框架或插件在自己使用的时候,为了兼容可能会出现 function_exists(spl_autoload_register)。<?phpfunction lionisIsCoolFind($classname) {require './' . $classname . '.php';}// 函数spl_autoload_register('lionisIsCoolFind');// 匿名函数spl_autoload_register(function($require) {require './' . $classname . '.php';});// 类中的函数spl_autoload_register(array('Lionis', 'loadClass'));欧耶,这下我们可以写很多不同的自动加载函数了。信息时代师傅小心,前面有妖气! 。如果我们每个人都自己实现一套自动加载的方法,每个PHP 组件和 框架都使用独特的自动加载器,而且每个框架使用不同的逻辑加载PHP类、接口和性状。那当我们使用一些第三方框架的时候,还需要去弄清楚引导文件中的 自动加载器,那样是有多和 时间 过不去呢。 PHP-FIG 认识到了这个问题了,推荐使用 PSR-4 规范,来促进组件之间的 互操作性,这样我们就可以使用一个自动加载器了。PSR-4 规范利用命名空间的前缀和文件系统中的目录对应起来。映射关系为namespace => filePath\Lionis\Cool => cool带有命名空间的类<?php// 该文件为 cool/Real.phpnamespace \Lionis\Cool;class Real {}创建一个对象<?php// 该文件为 index.php$lionis = new \Lionis\Cool\Real;这个时候,按照 PSR-4 的规范,自动加载器应该去加载 cool/ 目录下的 Real.php。不对!那这样不是还要自己去实现 自动加载器 嘛,不然怎么 无中生有 出现 自动加载器 呢?难道官方 内置 了?你 out 了吧,我们可以使用依赖管理器 composer 来生成 PSR-4 自动加载器。你可能会疑问,那我的旧项目没有遵循 PSR-4 规范怎么办?嘿嘿,让我们来探索发现一下 composer 是怎么解决这个问题的吧。Composer哦吼吼,我们这次的重点在与探究自动加载,所以 composer 的安装和使用等,就不去讨论了。composer 自动加载设置了 4种 加载方式:PSR-0PSR-4classmapfilesPSR-0要求命名空间和目录层层对应,且可以使用 _ 作为路径分隔符,但是这会导致目录结果变得过深。在 composer 执行 install 等操作时,composer 会把文件中的配置存储在 vendor/composer/autoload_psr0.php文件中的返回数组中。例如:定义了Very\Good=>vendor\Lionis\IsReal\Cool,在调用 use Very\Good\Love\SomeClass,PSR-0 加载的实际目录为 vendor/Lionis/IsReal/Cool/Very/Good/Love/SomeClass.php。对吧,这简直深得吓人,所以 PSR-0 被官方废除了。但是一些主流的框架已经实现了 PSR-0,为了向下兼容还是要实现 PSR-0。composer.json配置:"autoload": {"psr-0": { "Very\\Good": "vendor\Lionis\IsReal\Cool" }}PSR-4PSR-4 是现在比较推荐的方法,用于替代 PSR-0。与 PSR-0 不同的是,取消掉了 _ 作为分隔符和目录结构。在 composer 执行 install 等操作时,composer 会把文件中的配置存储在 vendor/composer/autoload_psr4.php文件中的返回数组中。例如:定义了Very\Good=>vendor\Lionis\IsReal\Cool,在调用 use Very\Good\Love\SomeClass,PSR-4 加载的实际目录为 vendor/Lionis/IsReal/Cool/Love/SomeClass.php。composer.json配置:"autoload": {"psr-4": { "Very\\Good": "vendor\Lionis\IsReal\Cool" }}classmapclassmap 通过配置指定的目录和文件,在 composer 执行 install 等操作时,composer 会去扫描对应的目录下以.php结尾的文件中的 class,并存储在 vendor/composer/autoload_classmap.php文件中的返回数组中。composer.json配置:"autoload": {"classmap": [ "Lionis/", "Xiaoer/" ]}如果 Lionis 下有一个叫 VeryCool的文件,那么在vendor/composer/autoload_classmap.php 中会生成。<?php// autoload_classmap.php @generated by Composer$vendorDir = dirname(dirname(__FILE__));$baseDir = dirname($vendorDir);return array('VeryCool' => $baseDir . '/Lionis/VeryCool.php', // 其他的映射);filesfiles 就是直接简单粗暴的加载文件。在 composer 执行 install 等操作时,composer 会把文件中的配置存储在 vendor/composer/autoload_static.php文件中的生成一个 $files 数组。composer.json 配置:"autoload": {"files": ["Lionis/Very/Cool.php"]}小结composer 通过使用 composer.json,用 json 的格式来指定我们需要自动加载的规则。我们只要在入口文件引入 vendor/autoload.php 就能很方便的便能使用 自动加载。如果你对 composer 实现 自动加载 的原理感兴趣,可以顺着 vendor 中的 autoload.php 去看看源码。总结从 石器时代 到 信息时代,PHP 经历了很多试验和改变后正在变得越来越好。当然,许多优秀的框架让我们开发速度更快,需要理解的一些知识点也随之被隐藏起来,让我们更加专注于实现逻辑。但是,我们有的时候还是要尝试的去理解他们工作的原理,来提升我们自己。像我老师说过的,所不定一下子踩到狗屎运了呢。更多细说 PHP 类库自动加载
2023年08月09日
15 阅读
0 评论
0 点赞
2023-08-09
编程书籍 收藏集
Netkiller - 免费电子书系列https://www.netkiller.cn/home/technology.html Netkiller Blockchain 手札Netkiller Management 手札Netkiller Architect 手札Netkiller Linux 手札Netkiller Java 手札Netkiller Spring 手札Netkiller DevOps 手札Netkiller Virtualization 手札Netkiller Developer 手札 Netkiller PHP 手札 Netkiller Python 手札Netkiller Testing 手札Netkiller Cryptography 手札Netkiller Database 手札Netkiller PostgreSQL 手札Netkiller MySQL 手札Netkiller NoSQL 手札Netkiller Docbook 手札Netkiller Project 手札Netkiller Multimedia 手札Netkiller Perl 手札Netkiller FreeBSD 手札Netkiller Shell 手札Netkiller Security 手札Netkiller Web 手札Netkiller Monitoring 手札Netkiller Storage 手札Netkiller Mail 手札Netkiller LDAP 手札Netkiller Network 手札Netkiller Cisco IOS 手札Netkiller H3C 手札Netkiller Amateur Radio 手札高层建瓴《计算机程序设计艺术》《计算机网络》
2023年08月09日
20 阅读
0 评论
0 点赞
2023-08-09
网站技术 收藏集
亿级用户PC主站的PHP7升级实践
2023年08月09日
7 阅读
0 评论
0 点赞
2023-08-09
4种PHP回调函数风格
4种PHP回调函数风格匿名函数$server->on('Request', function ($req, $resp) { echo "hello world"; });类静态方法class A { static function test($req, $resp) { echo "hello world"; } } $server->on('Request', 'A::Test'); $server->on('Request', array('A', 'Test'));函数function my_onRequest($req, $resp) { echo "hello world"; } $server->on('Request', 'my_onRequest');对象方法class A { function test($req, $resp) { echo "hello world"; } } $object = new A(); $server->on('Request', array($object, 'test'));
2023年08月09日
15 阅读
0 评论
0 点赞
2023-08-09
php的mkdir()函数的权限诡异问题探究
php的mkdir()函数的权限诡异问题探究这篇文章主要介绍了php的mkdir()函数创建文件夹比较安全的权限设置方法,遇到的情况是系统umask影响了mkdir的指定权限参数比期望要小,使用chmod函数则没有这个问题,需要的朋友可以参考下问题描述:使用以下php代码创建了一个目录,期望目录的权限是0777,实际结果是0755mkdir('./aa/',0777);分析与测试结果:1.mkdir()函数指定的目录权限只能小于等于系统umask设定的默认权限。如linux默认的umask一般0022, 即创建目录的默认权限是0755, 所以这时php mkdir('./aa/',0777) 得到目录的权限是0755.xw@xw-X201:~/Desktop/dd/aa$ umask0022xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw/',0777);"xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw1/',0755);"xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw2/',0747);"xw@xw-X201:~/Desktop/dd/aa$ ll总用量 20drwxrwxrwx 5 xw xw 4096 2012-06-01 11:58 ./drwxr-xr-x 6 xw xw 4096 2012-06-01 11:26 ../drwxr-xr-x 2 xw xw 4096 2012-06-01 11:57 xw/drwxr-xr-x 2 xw xw 4096 2012-06-01 11:58 xw1/drwxr--r-x 2 xw xw 4096 2012-06-01 11:58 xw2/把系统默认权限改为777,mkdir()可以指定更大权限了xw@xw-X201:~/Desktop/dd/aa$ umask 000xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw2/',0777);"xw@xw-X201:~/Desktop/dd/aa$ ll总用量 12drwxrwxrwx 3 xw xw 4096 2012-06-01 12:08 ./drwxr-xr-x 6 xw xw 4096 2012-06-01 11:26 ../drwxrwxrwx 2 xw xw 4096 2012-06-01 12:08 xw2/2.chmod()函数不受系统umask影响,可以设置比系统默认权限大的权限。xw@xw-X201:~/Desktop/dd/aa$ umask0022xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw1/',0777);"xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw2/');"xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw3/');chmod('./xw3/',0777);"xw@xw-X201:~/Desktop/dd/aa$ ll总用量 20drwxrwxrwx 5 xw xw 4096 2012-06-01 12:12 ./drwxr-xr-x 6 xw xw 4096 2012-06-01 11:26 ../drwxr-xr-x 2 xw xw 4096 2012-06-01 12:11 xw1/drwxr-xr-x 2 xw xw 4096 2012-06-01 12:11 xw2/drwxrwxrwx 2 xw xw 4096 2012-06-01 12:12 xw3/3.系统的mkdir命令可以设置大于默认值的权限。xw@xw-X201:~/Desktop/dd/aa$ umask0022xw@xw-X201:~/Desktop/dd/aa$ mkdir -m0777 xwxw@xw-X201:~/Desktop/dd/aa$ ll总用量 12drwxrwxrwx 3 xw xw 4096 2012-06-01 12:18 ./drwxr-xr-x 6 xw xw 4096 2012-06-01 11:26 ../drwxrwxrwx 2 xw xw 4096 2012-06-01 12:18 xw/总结:php若要创建一个有读写权限的目录,最好使用以下代码,不要直接使用mkdir函数指定权限,以避免系统umask的影响mkdir('./xw/');chmod('./xw/',0777);
2023年08月09日
6 阅读
0 评论
0 点赞
1
...
98
99
100
...
158