首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
136 阅读
2
php接口优化 使用curl_multi_init批量请求
130 阅读
3
2024年备考系统架构设计师
102 阅读
4
《从菜鸟到大师之路 ElasticSearch 篇》
101 阅读
5
PHP 文件I/O
89 阅读
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
累计撰写
785
篇文章
累计收到
5
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
559
篇与
的结果
2023-12-28
“重构” PHP 代码!
“重构” PHP 代码!重构指的是在不改变原有功能的情况下,修改或者重新编写代码。下面的例子中,我将向你展示如何更好地编写代码。1 - 表现力这可能只是一个简单的技巧,但编写富有表现力的代码可以大大改进我们的代码。总是让代码自我解释,这样未来的你或其他开发人员都能知道代码中发生了什么。不过也有开发人员表示,命名是编程中最困难的事情之一。这就是为什么这不像听起来那么容易的原因之一。示例 #1 - 命名之前// ❌ 这个方法是用来做什么的,方法名表达并不清晰 // ❌ 是设置状态还是检查状态呢? $status = $user->status('pending');之后// ✅ 通过添加 is,使方法名表达的意图更清晰 // ✅ 检测用户状态是否与给定状态相等 // ✅ 同时新变量名让我们可以推断它是布尔值 $isUserPending = $user->isStatus('pending');示例 #2 - 命名之前// ❌ 这个类返回的是什么?类名?类全名?还是类路径? return $factory->getTargetClass();之后// ✅ 我们获取的是类路径 // ✅ 如果用户想要类名?则找错了方法 return $factory->getTargetClassPath();示例 #3 - 提取之前// ❌ 重复的代码 ( "file_get_contents", "base_path" 方法以及文件扩展) // ❌ 此刻,我们不去关心如何获得code examples public function setCodeExamples(string $exampleBefore, string $exampleAfter) { $this->exampleBefore = file_get_contents(base_path("$exampleBefore.md")); $this->exampleAfter = file_get_contents(base_path("$exampleAfter.md")); }之后public function setCodeExamples(string $exampleBefore, string $exampleAfter) { // ✅ 代码直接说明了我们的意图:获取code example(不关注如何获取) $this->exampleBefore = $this->getCodeExample($exampleBefore); $this->exampleAfter = $this->getCodeExample($exampleAfter); } // ✅ 这个新方法可多次调用 private function getCodeExample(string $exampleName): string { return file_get_contents(base_path("$exampleName.md")); }示例 #4 - 提取之前// ❌ 多重 where 语句,使阅读变得困难 // ❌ 意图究竟是什么呢? User::whereNotNull('subscribed')->where('status', 'active');之后// ✅ 这个新的scope方法说明了发生了什么事 // ✅ 如果我们需要了解更多细节,可以进入这个scope方法内部去了解 // ✅ "subscribed" scope 方法可在其他地方使用 User::subscribed();示例 #5 - 提取这是我之前项目的一个例子。我们用命令行导入用户。ImportUsersCommand 类中含有一个 handle 方法,用来处理任务。之前protected function handle() { // ❌ 这个方法包含太多代码 $url = $this->option('url') ?: $this->ask('Please provide the URL for the import:'); $importResponse = $this->http->get($url); // ❌ 进度条对用户很有用,不过却让代码显得杂乱 $bar = $this->output->createProgressBar($importResponse->count()); $bar->start(); $this->userRepository->truncate(); collect($importResponse->results)->each(function (array $attributes) use ($bar) { $this->userRepository->create($attributes); $bar->advance(); }); // ❌ 很难说清此处发生了哪些行为 $bar->finish(); $this->output->newLine(); $this->info('Thanks. Users have been imported.'); if($this->option('with-backup')) { $this->storage ->disk('backups') ->put(date('Y-m-d').'-import.json', $response->body()); $this->info('Backup was stored successfully.'); } }之后protected function handle(): void { // ✅ handle方法是你访问该类首先会查看的方法 // ✅ 现在可以很容易就对这个方法做了些什么有个粗略的了解 $url = $this->option('url') ?: $this->ask('Please provide the URL for the import:'); $importResponse = $this->http->get($url); $this->importUsers($importResponse->results); $this->saveBackupIfAsked($importResponse); } // ✅ 如果需要了解更多细节,可以查看这些专用的方法 protected function importUsers($userData): void { $bar = $this->output->createProgressBar(count($userData)); $bar->start(); $this->userRepository->truncate(); collect($userData)->each(function (array $attributes) use ($bar) { $this->userRepository->create($attributes); $bar->advance(); }); $bar->finish(); $this->output->newLine(); $this->info('Thanks. Users have been imported.'); } // ✅ 不要害怕使用多行代码 // ✅ 这个例子中它让我们核心的 handle 方法更为简洁 protected function saveBackupIfAsked(Response $response): void { if($this->option('with-backup')) { $this->storage ->disk('backups') ->put(date('Y-m-d').'-import.json', $response->body()); $this->info('Backup was stored successfully.'); } }2 - 提前返回提前返回指的是,我们尝试通过将结构分解为特定 case 来避免嵌套的做法。这样,我们得到了更线性的代码,更易于阅读和了解。不要害怕使用多个 return 语句。示例 #1之前public function calculateScore(User $user): int { if ($user->inactive) { $score = 0; } else { // ❌ 怎么又有一个 "if"? if ($user->hasBonus) { $score = $user->score + $this->bonus; } else { // ❌ 由于存在多个层级,大费眼神 ? $score = $user->score; } } return $score; }之后public function calculateScore(User $user): int { // ✅ 边缘用例提前检测 if ($user->inactive) { return 0; } // ✅ 每个用例都有自己的代码块,使得更容易跟进 if ($user->hasBonus) { return $user->score + $this->bonus; } return $user->score; }示例 #2之前public function sendInvoice(Invoice $invoice): void { if($user->notificationChannel === 'Slack') { $this->notifier->slack($invoice); } else { // ❌ 即使是简单的ELSE都影响代码的可读性 $this->notifier->email($invoice); } }之后public function sendInvoice(Invoice $invoice): bool { // ✅ 每个条件都易读 if($user->notificationChannel === 'Slack') { return $this->notifier->slack($invoice); } // ✅ 不用再考虑ELSE 指向哪里 return $this->notifier->email($invoice); }Note: 有时你会听到 “防卫语句” 这样的术语,它是通过提前返回实现。3 - 重构成集合 Collection在 PHP 中,我们在很多不同数据中都用到了数组。处理及转换这些数组可用功能非常有限,并且没有提供良好的体验。(array_walk, usort, etc)要处理这个问题,有一个 Collection 类的概念,可用于帮你处理数组。最为人所知的是 Laravel 中的实现,其中的 collection 类提供了许多有用的特性,用来处理数组。注意: 以下例子, 我将使用 Laravel 的 collect () 辅助函数,不过在其他框架或库中的使用方式也很相似。示例 #1之前// ❌ 这里我们有一个临时变量 $score = 0; // ❌ 用循环没有问题,不过可读性还是有改善空间 foreach($this->playedGames as $game) { $score += $game->score; } return $score;之后// ✅ 集合是带有方法的对象 // ✅ sum 方法使之更具表现力 return collect($this->playedGames) ->sum('score');示例 #2之前$users = [ [ 'id' => 801, 'name' => 'Peter', 'score' => 505, 'active' => true], [ 'id' => 844, 'name' => 'Mary', 'score' => 704, 'active' => true], [ 'id' => 542, 'name' => 'Norman', 'score' => 104, 'active' => false], ]; // 请求结果: 只显示活跃用户,以 score 排序 ["Mary(704)","Peter(505)"] $users = array_filter($users, fn ($user) => $user['active']); // ❌ usort 进行排序处理的又是哪一个对象呢?它是如何实现? usort($users, fn($a, $b) => $a['score'] < $b['score']); // ❌ 所有的转换都是分离的,不过都是users相关的 $userHighScoreTitles = array_map(fn($user) => $user['name'] . '(' . $user['score'] . ')', $users); return $userHighScoreTitles;之后$users = [ [ 'id' => 801, 'name' => 'Peter', 'score' => 505, 'active' => true], [ 'id' => 844, 'name' => 'Mary', 'score' => 704, 'active' => true], [ 'id' => 542, 'name' => 'Norman', 'score' => 104, 'active' => false], ]; // 请求结果: 只显示活跃用户,以 score 排序 ["Mary(704)","Peter(505)"] // ✅ 只传入一次users return collect($users) // ✅ 我们通过管道将其传入所有方法 ->filter(fn($user) => $user['active']) ->sortBy('score') ->map(fn($user) => "{$user['name']} ({$user['score']})" ->values() // ✅ 最后返回数组 ->toArray();4 - 一致性每一行代码都会增加少量的视觉噪音。代码越多,阅读起来就越困难。这就是为什么制定规则很重要。保持类似的东西一致将帮助您识别代码和模式。这将导致更少的噪声和更可读的代码。示例 #1之前class UserController { // ❌ 确定如何命名变量(驼峰或是蛇形等),不要混用! public function find($userId) { } } // ❌ 选择使用单数或者复数形式命名控制器,并保持一致 class InvoicesController { // ❌ 修改了样式,如花扣号的位置,影响可读性 public function find($user_id) { } }之后class UserController { // ✅ 所有变量驼峰式命名 public function find($userId) { } } // ✅ 控制器命名规则一致(此处都使用单数) class InvoiceController { // ✅ 花括号的位置(格式)一致,使代码更为可读 public function find($userId) { } }示例 #2之前class PdfExporter { // ❌ "handle" 和 "export" 是类似方法的不同名称 public function handle(Collection $items): void { // export items... } } class CsvExporter { public function export(Collection $items): void { // export items... } } // ❌ 使用时你会疑惑它们是否处理相似的任务 // ❌ 你可能需要再去查看类源码进行确定 $pdfExport->handle(); $csvExporter->export();之后// ✅ 可通过接口提供通用规则保持一致性 interface Exporter { public function export(Collection $items): void; } class PdfExporter implements Exporter { public function export(Collection $items): void { // export items... } } class CsvExporter implements Exporter { public function export(Collection $items): void { // export items... } } // ✅ 对类似的任务使用相同的方法名,更具可读性 // ✅ 不用再去查看类源码,变可知它们都用在导出数据 $pdfExport->export(); $csvExporter->export();重构 ❤️ 测试我已经提到过重构不会改变代码的功能。这在运行测试时很方便,因为它们也应该在重构之后工作。这就是为什么我只有在有测试的时候才开始重构代码。他们将确保我不会无意中更改代码的行为。所以别忘了写测试,甚至去 TDD。
2023年12月28日
15 阅读
0 评论
0 点赞
2023-12-28
PHP预处理查询如何防止SQL注入?
PHP预处理查询如何防止SQL注入?目前最有效的防止 sql 注入的方式使用预处理语句和参数化查询。以最常用的 PHP PDO 扩展为例。官方文档中对预处理语句的介绍什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。预处理语句的两大好处:1.查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析 / 编译 / 优化周期。简言之,预处理语句占用更少的资源,因而运行得更快。2.提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生 SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。PDO 的特性在于驱动程序不支持预处理的时候,PDO 将模拟处理,此时的预处理-参数化查询过程在 PDO 的模拟器中完成。PDO 模拟器根据 DSN 中指定的字符集对输入参数进行本地转义,然后拼接成完整的 SQL 语句,发送给 MySQL 服务端。所以,PDO 模拟器能否正确的转义输入参数,是拦截 SQL 注入的关键。小于 5.3.6 的 PHP 版本,DSN (Data Source Name) 是默认忽略 charset 参数的。这时如果使用 PDO 的本地转义,仍然可能导致 SQL 注入。因此,像 Laravel 框架底层会直接设置 PDO::ATTR_EMULATE_PREPARES=false,来确保 SQL 语句和参数值在被发送到 MySQL 服务器之前不会被 PHP 解析。PHP 的实现// 查询 $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindValue(':calories', $calories, PDO::PARAM_INT); $sth->bindValue(':colour', $colour, PDO::PARAM_STR); $sth->execute(); // 插入,修改,删除 $preparedStmt = $db->prepare('INSERT INTO table (column) VALUES (:column)'); $preparedStmt->execute(array(':column' => $unsafeValue));Laravel 的底层实现// 查询的实现 public function select($query, $bindings = [], $useReadPdo = true) { return $this->run($query, $bindings, function ($query, $bindings) use ($useReadPdo) { if ($this->pretending()) { return []; } $statement = $this->prepared( $this->getPdoForSelect($useReadPdo)->prepare($query) ); $this->bindValues($statement, $this->prepareBindings($bindings)); $statement->execute(); return $statement->fetchAll(); }); } // 修改删除的实现 public function affectingStatement($query, $bindings = []) { return $this->run($query, $bindings, function ($query, $bindings) { if ($this->pretending()) { return 0; } $statement = $this->getPdo()->prepare($query); $this->bindValues($statement, $this->prepareBindings($bindings)); $statement->execute(); $this->recordsHaveBeenModified( ($count = $statement->rowCount()) > 0 ); return $count; }); }
2023年12月28日
10 阅读
0 评论
0 点赞
2023-12-28
PHP是做什么的之应用场景非比寻常
PHP具体可以做什么?Web开发是PHP语言最擅长的!PHP可以开发像淘宝、京东等商城系统。目前国内80%以上的动态网站都在使用PHP开发,没有任何语言可以与其抗衡!全球前100万的网站中,有77%以上的网站都是通过PHP来开发的(权威网站w3techs.com 2023年2月统计)PHP具体可以做:商城开发视频/直播系统开发广告系统开发API接口开发移动端APP开发微信开发小程序开发游戏后台开发物联网开发行业站/公司官网客户CRM管理系统财务系统开发办公自动化OA系统开发等等。
2023年12月28日
11 阅读
0 评论
0 点赞
2023-12-28
PHP用流方式下载文件的优势浅析
PHP用流方式下载文件的优势浅析在PHP中,可以使用fopen()函数打开一个远程文件,并使用流来下载文件内容到本地文件。这样优点是不用将文件全部一次性放入内存中,可以避免内存溢出的问题。下面是一个示例代码:$url = 'http://example.com/file.zip'; $local_file = '/path/to/local/file.zip'; // 打开远程文件 $remote_file = fopen($url, 'r'); // 打开本地文件 $fp = fopen($local_file, 'w'); // 使用流下载文件内容 while (!feof($remote_file)) { fwrite($fp, fread($remote_file, 1024)); } // 关闭文件 fclose($remote_file); fclose($fp);在上面的代码中,使用fopen()函数打开远程文件和本地文件,然后使用fread()函数从远程文件读取内容,并使用fwrite()函数将内容写入本地文件。注意,在使用流下载文件时,需要确保服务器允许远程访问,否则可能会出现错误。使用流下载文件时,需要注意以下事项:需要确保服务器允许远程访问,否则可能会出现错误。如果本地文件已存在,会被覆盖。如果不希望覆盖,可以在打开本地文件时指定 a 模式,表示追加到文件末尾。在下载大文件时,可能会用时较长,可以使用进度条显示下载进度。如果远程文件不存在或访问出错,可能会导致下载失败。在下载文件时,可以使用 HTTP 头信息来控制文件缓存、文件类型和文件下载方式等。在下载过程中,需要确保远程文件和本地文件都已正常打开,否则可能会出现错误。在读取远程文件时,需要使用 feof () 函数检查文件是否已读完,否则可能会出现死循环。在下载过程中,需要注意带宽限制和网络状况,否则可能会导致下载速度过慢。在 PHP 中,使用 fopen () 函数打开远程文件需要在 php.ini 中启用 allow_url_fopen 选项,在 PHP 中,allow_url_fopen 选项默认是开启的。
2023年12月28日
9 阅读
0 评论
0 点赞
2023-12-27
PHP常用函数大全
PHP常用函数大全Math 函数abs — 绝对值acos — 反余弦acosh — 反双曲余弦asin — 反正弦asinh — 反双曲正弦atan2 — 两个参数的反正切atan — 反正切atanh — 反双曲正切base_convert — 在任意进制之间转换数字bindec — 二进制转换为十进制ceil — 进一法取整cos — 余弦cosh — 双曲余弦decbin — 十进制转换为二进制dechex — 十进制转换为十六进制decoct — 十进制转换为八进制deg2rad — 将角度转换为弧度exp — 计算 e 的指数expm1 — 返回 exp(number) - 1,甚至当 number 的值接近零也能计算出准确结果floor — 舍去法取整fmod — 返回除法的浮点数余数getrandmax — 显示随机数最大的可能值hexdec — 十六进制转换为十进制hypot — 计算一直角三角形的斜边长度intdiv — 对除法结果取整is_finite — 判断是否为有限值is_infinite — 判断是否为无限值is_nan — 判断是否为合法数值lcg_value — 组合线性同余发生器log10 — 以 10 为底的对数log1p — 返回 log(1 + number),甚至当 number 的值接近零也能计算出准确结果log — 自然对数max — 找出最大值min — 找出最小值mt_getrandmax — 显示随机数的最大可能值mt_rand — 生成更好的随机数mt_srand — 播下一个更好的随机数发生器种子octdec — 八进制转换为十进制pi — 得到圆周率值pow — 指数表达式rad2deg — 将弧度数转换为相应的角度数rand — 产生一个随机整数round — 对浮点数进行四舍五入sin — 正弦sinh — 双曲正弦sqrt — 平方根srand — 播下随机数发生器种子tan — 正切tanh — 双曲正切字符串函数addcslashes — 以 C 语言风格使用反斜线转义字符串中的字符addslashes — 使用反斜线引用字符串bin2hex — 函数把包含数据的二进制字符串转换为十六进制值chop — rtrim 的别名chr — 返回指定的字符chunk_split — 将字符串分割成小块convert_cyr_string — 将字符由一种 Cyrillic 字符转换成另一种convert_uudecode — 解码一个 uuencode 编码的字符串convert_uuencode — 使用 uuencode 编码一个字符串count_chars — 返回字符串所用字符的信息crc32 — 计算一个字符串的 crc32 多项式crypt — 单向字符串散列echo — 输出一个或多个字符串explode — 使用一个字符串分割另一个字符串fprintf — 将格式化后的字符串写入到流get_html_translation_table — 返回使用 htmlspecialchars 和 htmlentities 后的转换表hebrev — 将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew)hebrevc — 将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew),并且转换换行符hex2bin — 转换十六进制字符串为二进制字符串html_entity_decode — Convert HTML entities to their corresponding charactershtmlentities — 将字符转换为 HTML 转义字符htmlspecialchars_decode — 将特殊的 HTML 实体转换回普通字符htmlspecialchars — 将特殊字符转换为 HTML 实体implode — 将一个一维数组的值转化为字符串join — 别名 implodelcfirst — 使一个字符串的第一个字符小写levenshtein — 计算两个字符串之间的编辑距离localeconv — Get numeric formatting informationltrim — 删除字符串开头的空白字符(或其他字符)md5_file — 计算指定文件的 MD5 散列值md5 — 计算字符串的 MD5 散列值metaphone — Calculate the metaphone key of a stringmoney_format — 将数字格式化成货币字符串nl_langinfo — Query language and locale informationnl2br — 在字符串所有新行之前插入 HTML 换行标记number_format — 以千位分隔符方式格式化一个数字ord — 转换字符串第一个字节为 0-255 之间的值parse_str — 将字符串解析成多个变量print — 输出字符串printf — 输出格式化字符串quoted_printable_decode — 将 quoted-printable 字符串转换为 8-bit 字符串quoted_printable_encode — 将 8-bit 字符串转换成 quoted-printable 字符串quotemeta — 转义元字符集rtrim — 删除字符串末端的空白字符(或者其他字符)setlocale — 设置地区信息sha1_file — 计算文件的 sha1 散列值sha1 — 计算字符串的 sha1 散列值similar_text — 计算两个字符串的相似度soundex — Calculate the soundex key of a stringsprintf — Return a formatted stringsscanf — 根据指定格式解析输入的字符str_getcsv — 解析 CSV 字符串为一个数组str_ireplace — str_replace 的忽略大小写版本str_pad — 使用另一个字符串填充字符串为指定长度str_repeat — 重复一个字符串str_replace — 子字符串替换str_rot13 — 对字符串执行 ROT13 转换str_shuffle — 随机打乱一个字符串str_split — 将字符串转换为数组str_word_count — 返回字符串中单词的使用情况strcasecmp — 二进制安全比较字符串(不区分大小写)strchr — 别名 strstrstrcmp — 二进制安全字符串比较strcoll — 基于区域设置的字符串比较strcspn — 获取不匹配遮罩的起始子字符串的长度strip_tags — 从字符串中去除 HTML 和 PHP 标记stripcslashes — 反引用一个使用 addcslashes 转义的字符串stripos — 查找字符串首次出现的位置(不区分大小写)stripslashes — 反引用一个引用字符串stristr — strstr 函数的忽略大小写版本strlen — 获取字符串长度strnatcasecmp — 使用“自然顺序”算法比较字符串(不区分大小写)strnatcmp — 使用自然排序算法比较字符串strncasecmp — 二进制安全比较字符串开头的若干个字符(不区分大小写)strncmp — 二进制安全比较字符串开头的若干个字符strpbrk — 在字符串中查找一组字符的任何一个字符strpos — 查找字符串首次出现的位置strrchr — 查找指定字符在字符串中的最后一次出现strrev — 反转字符串strripos — 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)strrpos — 计算指定字符串在目标字符串中最后一次出现的位置strspn — 计算字符串中全部字符都存在于指定字符集合中的第一段子串的长度。strstr — 查找字符串的首次出现strtok — 标记分割字符串strtolower — 将字符串转化为小写strtoupper — 将字符串转化为大写strtr — 转换指定字符substr_compare — 二进制安全比较字符串(从偏移位置比较指定长度)substr_count — 计算字串出现的次数substr_replace — 替换字符串的子串substr — 返回字符串的子串trim — 去除字符串首尾处的空白字符(或者其他字符)ucfirst — 将字符串的首字母转换为大写ucwords — 将字符串中每个单词的首字母转换为大写vfprintf — 将格式化字符串写入流vprintf — 输出格式化字符串vsprintf — 返回格式化字符串wordwrap — 打断字符串为指定数量的字串数组函数array_change_key_case — 将数组中的所有键名修改为全大写或小写array_chunk — 将一个数组分割成多个array_column — 返回数组中指定的一列array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值array_count_values — 统计数组中所有的值array_diff_assoc — 带索引检查计算数组的差集array_diff_key — 使用键名比较计算数组的差集array_diff_uassoc — 用用户提供的回调函数做索引检查来计算数组的差集array_diff_ukey — 用回调函数对键名比较计算数组的差集array_diff — 计算数组的差集array_fill_keys — 使用指定的键和值填充数组array_fill — 用给定的值填充数组array_filter — 用回调函数过滤数组中的单元array_flip — 交换数组中的键和值array_intersect_assoc — 带索引检查计算数组的交集array_intersect_key — 使用键名比较计算数组的交集array_intersect_uassoc — 带索引检查计算数组的交集,用回调函数比较索引array_intersect_ukey — 用回调函数比较键名来计算数组的交集array_intersect — 计算数组的交集array_key_exists — 检查数组里是否有指定的键名或索引array_key_first — Gets the first key of an arrayarray_key_last — Gets the last key of an arrayarray_keys — 返回数组中部分的或所有的键名array_map — 为数组的每个元素应用回调函数array_merge_recursive — 递归地合并一个或多个数组array_merge — 合并一个或多个数组array_multisort — 对多个数组或多维数组进行排序array_pad — 以指定长度将一个值填充进数组array_pop — 弹出数组最后一个单元(出栈)array_product — 计算数组中所有值的乘积array_push — 将一个或多个单元压入数组的末尾(入栈)array_rand — 从数组中随机取出一个或多个单元array_reduce — 用回调函数迭代地将数组简化为单一的值array_replace_recursive — 使用传递的数组递归替换第一个数组的元素array_replace — 使用传递的数组替换第一个数组的元素array_reverse — 返回单元顺序相反的数组array_search — 在数组中搜索给定的值,如果成功则返回首个相应的键名array_shift — 将数组开头的单元移出数组array_slice — 从数组中取出一段array_splice — 去掉数组中的某一部分并用其它值取代array_sum — 对数组中所有值求和array_udiff_assoc — 带索引检查计算数组的差集,用回调函数比较数据array_udiff_uassoc — 带索引检查计算数组的差集,用回调函数比较数据和索引array_udiff — 用回调函数比较数据来计算数组的差集array_uintersect_assoc — 带索引检查计算数组的交集,用回调函数比较数据array_uintersect_uassoc — 带索引检查计算数组的交集,用单独的回调函数比较数据和索引array_uintersect — 计算数组的交集,用回调函数比较数据array_unique — 移除数组中重复的值array_unshift — 在数组开头插入一个或多个单元array_values — 返回数组中所有的值array_walk_recursive — 对数组中的每个成员递归地应用用户函数array_walk — 使用用户自定义函数对数组中的每个元素做回调处理array — 新建一个数组arsort — 对数组进行逆向排序并保持索引关系asort — 对数组进行排序并保持索引关系compact — 建立一个数组,包括变量名和它们的值count — 计算数组中的单元数目,或对象中的属性个数current — 返回数组中的当前单元each — 返回数组中当前的键/值对并将数组指针向前移动一步end — 将数组的内部指针指向最后一个单元extract — 从数组中将变量导入到当前的符号表in_array — 检查数组中是否存在某个值key_exists — 别名 array_key_existskey — 从关联数组中取得键名krsort — 对数组按照键名逆向排序ksort — 对数组按照键名排序list — 把数组中的值赋给一组变量natcasesort — 用“自然排序”算法对数组进行不区分大小写字母的排序natsort — 用“自然排序”算法对数组排序next — 将数组中的内部指针向前移动一位pos — current 的别名prev — 将数组的内部指针倒回一位range — 根据范围创建数组,包含指定的元素reset — 将数组的内部指针指向第一个单元rsort — 对数组逆向排序shuffle — 打乱数组sizeof — count 的别名sort — 对数组排序uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联uksort — 使用用户自定义的比较函数对数组中的键名进行排序usort — 使用用户自定义的比较函数对数组中的值进行排序多字节字符串函数mb_check_encoding — 检查字符串在指定的编码里是否有效mb_chr — Get a specific charactermb_convert_case — 对字符串进行大小写转换mb_convert_encoding — 转换字符的编码mb_convert_kana — Convert “kana” one from another (“zen-kaku”, “han-kaku” and more)mb_convert_variables — 转换一个或多个变量的字符编码mb_decode_mimeheader — 解码 MIME 头字段中的字符串mb_decode_numericentity — 根据 HTML 数字字符串解码成字符mb_detect_encoding — 检测字符的编码mb_detect_order — 设置/获取 字符编码的检测顺序mb_encode_mimeheader — 为 MIME 头编码字符串mb_encode_numericentity — Encode character to HTML numeric string referencemb_encoding_aliases — Get aliases of a known encoding typemb_ereg_match — Regular expression match for multibyte stringmb_ereg_replace_callback — Perform a regular expression search and replace with multibyte support using a callbackmb_ereg_replace — Replace regular expression with multibyte supportmb_ereg_search_getpos — Returns start point for next regular expression matchmb_ereg_search_getregs — Retrieve the result from the last multibyte regular expression matchmb_ereg_search_init — Setup string and regular expression for a multibyte regular expression matchmb_ereg_search_pos — Returns position and length of a matched part of the multibyte regular expression for a predefined multibyte stringmb_ereg_search_regs — Returns the matched part of a multibyte regular expressionmb_ereg_search_setpos — Set start point of next regular expression matchmb_ereg_search — Multibyte regular expression match for predefined multibyte stringmb_ereg — Regular expression match with multibyte supportmb_eregi_replace — Replace regular expression with multibyte support ignoring casemb_eregi — Regular expression match ignoring case with multibyte supportmb_get_info — 获取 mbstring 的内部设置mb_http_input — 检测 HTTP 输入字符编码mb_http_output — 设置/获取 HTTP 输出字符编码mb_internal_encoding — 设置/获取内部字符编码mb_language — 设置/获取当前的语言mb_list_encodings — 返回所有支持编码的数组mb_ord — Get code point of charactermb_output_handler — 在输出缓冲中转换字符编码的回调函数mb_parse_str — 解析 GET/POST/COOKIE 数据并设置全局变量mb_preferred_mime_name — 获取 MIME 字符串mb_regex_encoding — Set/Get character encoding for multibyte regexmb_regex_set_options — Set/Get the default options for mbregex functionsmb_scrub — Descriptionmb_send_mail — 发送编码过的邮件mb_split — 使用正则表达式分割多字节字符串mb_strcut — 获取字符的一部分mb_strimwidth — 获取按指定宽度截断的字符串mb_stripos — 大小写不敏感地查找字符串在另一个字符串中首次出现的位置mb_stristr — 大小写不敏感地查找字符串在另一个字符串里的首次出现mb_strlen — 获取字符串的长度mb_strpos — 查找字符串在另一个字符串中首次出现的位置mb_strrchr — 查找指定字符在另一个字符串中最后一次的出现mb_strrichr — 大小写不敏感地查找指定字符在另一个字符串中最后一次的出现mb_strripos — 大小写不敏感地在字符串中查找一个字符串最后出现的位置mb_strrpos — 查找字符串在一个字符串中最后出现的位置mb_strstr — 查找字符串在另一个字符串里的首次出现mb_strtolower — 使字符串小写mb_strtoupper — 使字符串大写mb_strwidth — 返回字符串的宽度mb_substitute_character — 设置/获取替代字符mb_substr_count — 统计字符串出现的次数mb_substr — 获取部分字符串时间函数checkdate — 验证一个格里高里日期date_add — 别名 DateTime::adddate_create_from_format — 别名 DateTime::createFromFormatdate_create_immutable_from_format — 别名 DateTimeImmutable::createFromFormatdate_create_immutable — 别名 DateTimeImmutable::__constructdate_create — 别名 DateTime::__constructdate_date_set — 别名 DateTime::setDatedate_default_timezone_get — 取得一个脚本中所有日期时间函数所使用的默认时区date_default_timezone_set — 设定用于一个脚本中所有日期时间函数的默认时区date_diff — 别名 DateTime::diffdate_format — 别名 DateTime::formatdate_get_last_errors — 别名 DateTime::getLastErrorsdate_interval_create_from_date_string — 别名 DateInterval::createFromDateStringdate_interval_format — 别名 DateInterval::formatdate_isodate_set — 别名 DateTime::setISODatedate_modify — 别名 DateTime::modifydate_offset_get — 别名 DateTime::getOffsetdate_parse_from_format — Get info about given date formatted according to the specified formatdate_parse — Returns associative array with detailed info about given datedate_sub — 别名 DateTime::subdate_sun_info — Returns an array with information about sunset/sunrise and twilight begin/enddate_sunrise — 返回给定的日期与地点的日出时间date_sunset — 返回给定的日期与地点的日落时间date_time_set — 别名 DateTime::setTimedate_timestamp_get — 别名 DateTime::getTimestampdate_timestamp_set — 别名 DateTime::setTimestampdate_timezone_get — 别名 DateTime::getTimezonedate_timezone_set — 别名 DateTime::setTimezonedate — 格式化一个本地时间/日期getdate — 取得日期/时间信息gettimeofday — 取得当前时间gmdate — 格式化一个 GMT/UTC 日期/时间gmmktime — 取得 GMT 日期的 UNIX 时间戳gmstrftime — 根据区域设置格式化 GMT/UTC 时间/日期idate — 将本地时间日期格式化为整数localtime — 取得本地时间microtime — 返回当前 Unix 时间戳和微秒数mktime — 取得一个日期的 Unix 时间戳strftime — 根据区域设置格式化本地时间/日期strptime — 解析由 strftime 生成的日期/时间strtotime — 将任何字符串的日期时间描述解析为 Unix 时间戳time — 返回当前的 Unix 时间戳timezone_abbreviations_list — 别名 DateTimeZone::listAbbreviationstimezone_identifiers_list — 别名 DateTimeZone::listIdentifierstimezone_location_get — 别名 DateTimeZone::getLocationtimezone_name_from_abbr — Returns the timezone name from abbreviationtimezone_name_get — 别名 DateTimeZone::getNametimezone_offset_get — 别名 DateTimeZone::getOffsettimezone_open — 别名 DateTimeZone::__constructtimezone_transitions_get — 别名 DateTimeZone::getTransitionstimezone_version_get — Gets the version of the timezonedb目录函数chdir — 改变目录chroot — 改变根目录closedir — 关闭目录句柄dir — 返回一个 Directory 类实例getcwd — 取得当前工作目录opendir — 打开目录句柄readdir — 从目录句柄中读取条目rewinddir — 倒回目录句柄scandir — 列出指定路径中的文件和目录文件系统函数basename — 返回路径中的文件名部分chgrp — 改变文件所属的组chmod — 改变文件模式chown — 改变文件的所有者clearstatcache — 清除文件状态缓存copy — 拷贝文件delete — 参见 unlink 或 unsetdirname — 返回路径中的目录部分disk_free_space — 返回目录中的可用空间disk_total_space — 返回一个目录的磁盘总大小diskfreespace — disk_free_space 的别名fclose — 关闭一个已打开的文件指针feof — 测试文件指针是否到了文件结束的位置fflush — 将缓冲内容输出到文件fgetc — 从文件指针中读取字符fgetcsv — 从文件指针中读入一行并解析 CSV 字段fgets — 从文件指针中读取一行fgetss — 从文件指针中读取一行并过滤掉 HTML 标记file_exists — 检查文件或目录是否存在file_get_contents — 将整个文件读入一个字符串file_put_contents — 将一个字符串写入文件file — 把整个文件读入一个数组中fileatime — 取得文件的上次访问时间filectime — 取得文件的 inode 修改时间filegroup — 取得文件的组fileinode — 取得文件的 inodefilemtime — 取得文件修改时间fileowner — 取得文件的所有者fileperms — 取得文件的权限filesize — 取得文件大小filetype — 取得文件类型flock — 轻便的咨询文件锁定fnmatch — 用模式匹配文件名fopen — 打开文件或者 URLfpassthru — 输出文件指针处的所有剩余数据fputcsv — 将行格式化为 CSV 并写入文件指针fputs — fwrite 的别名fread — 读取文件(可安全用于二进制文件)fscanf — 从文件中格式化输入fseek — 在文件指针中定位fstat — 通过已打开的文件指针取得文件信息ftell — 返回文件指针读/写的位置ftruncate — 将文件截断到给定的长度fwrite — 写入文件(可安全用于二进制文件)glob — 寻找与模式匹配的文件路径is_dir — 判断给定文件名是否是一个目录is_executable — 判断给定文件名是否可执行is_file — 判断给定文件名是否为一个正常的文件is_link — 判断给定文件名是否为一个符号连接is_readable — 判断给定文件名是否可读is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的is_writable — 判断给定的文件名是否可写is_writeable — is_writable 的别名lchgrp — 修改符号链接的所有组lchown — 修改符号链接的所有者link — 建立一个硬连接linkinfo — 获取一个连接的信息lstat — 给出一个文件或符号连接的信息mkdir — 新建目录move_uploaded_file — 将上传的文件移动到新位置parse_ini_file — 解析一个配置文件parse_ini_string — 解析配置字符串pathinfo — 返回文件路径的信息pclose — 关闭进程文件指针popen — 打开进程文件指针readfile — 输出文件readlink — 返回符号连接指向的目标realpath_cache_get — 获取真实目录缓存的详情realpath_cache_size — 获取真实路径缓冲区的大小realpath — 返回规范化的绝对路径名rename — 重命名一个文件或目录rewind — 倒回文件指针的位置rmdir — 删除目录set_file_buffer — stream_set_write_buffer 的别名stat — 给出文件的信息symlink — 建立符号连接tempnam — 建立一个具有唯一文件名的文件tmpfile — 建立一个临时文件touch — 设定文件的访问和修改时间umask — 改变当前的 umaskunlink — 删除文件
2023年12月27日
12 阅读
0 评论
0 点赞
1
...
30
31
32
...
112