Deprecated
: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in
/www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php
on line
1057
首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
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
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
29
篇与
的结果
2023-08-07
php中heredoc模板引擎方法小结
php中heredoc模板引擎方法小结Heredoc 技术,也叫字符串输出技术,在正规的PHP文档中和技术书籍中一般没有详细讲述,只是提到了这是一种Perl风格的字符串输出技术。之前在研究PW模板中经常发现,但一直不明白原理,其实这就是一种大量字符串输出的技术,这种技术不仅能大量输出字符串,而且还能实现了界面与代码的准分离,phpwind模板就是巧妙了使用这种技术,一个典型的例子!举个简单的例子:echo EOT<<<;My name is TomEOT;这样就输出一段span 可以看出里面照样可以使用双引号。也就是说在EOT<<<与EOT之间字符串可以按照HTML格式写,不需要转义,而且易于阅读。既然有这么方便的东西,不是就可以当作模板吗?看下下面这个模板页面name.html<!--<?php$name = 'Tom';print <<<EOT-->Untitled DocumentHello,$name!<!--<?phpEOT;?>-->如果采用php页面include ‘name.html’;结果输出Hello,Tom;而如果直接访问HTML;输出Hello,说明PHP部分被注释了。但是使用heredoc要注意几点:1.以<<<EOT开始标记开始,开始标记后面不能有空格,以EOT;结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号。之前因为养成了良好的缩进情况,一直无法正常解析,百思不得其解。。开始标记和开始标记相同,比如常用大写的EOT、EOD、EOF来表示,但是不只限于那几个,只要保证开始标记和结束标记不在正文中出现即可。2.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在heredoc中,变量不需要用连接符.或,来拼接,如果是数组需使用{}:如’Hi’$name, {$arrSet['name']}。Heredoc技术,在正规的PHP文档中和技术书籍中一般没有详细讲述,只是提到了这是一种Perl风格的字符串输出技术。但是现在的一些论坛程序,和部分文章系统,都巧妙的使用heredoc技术,来部分的实现了界面与代码的准分离,phpwind就是一个典型的例子。在PHP的文档中,只是提到了echo可以使用如下命令输出多行字符串(而且其中的变量被自动替换):PHP如下:echo <<<ENDThis uses the "here document" syntax to outputmultiple lines with $variable interpolation. Notethat the here document terminator must appear on aline with just a semicolon. no extra whitespace!END;上面的END结束符可以自己规定,在Phpwind,使用了“EOT”来结束。但是需要注意的是,这个END必须是在一行的开头才能有效,这其实是Heredoc技术的一个局限性(因为heredoc可以自定义结束符,所以引入了这个问题),在下面会提到。phpwind的模板文件一般存放在templatewind目录下面,在BBS目录中,使用require语句包含这个模板文件。其实这个模板文件是作为对应的PHP文件的一部分执行的,所以就不需要像PHPLib Template那样需要进行模板解析,然后再执行的过程。为了让heredoc的内容能被DreamWeaver这样的编辑器正确识别,以实现“所见即所得的”的网页设计,需要在heredoc中增加注释,示例文件如下:PHP代码如下:<!--<?phpprint <<<EOT-->Untitled Document<!--$name = '水木';print <<<EOT-->Hello,$name!<!--EOTprint <<<EOT--><!--EOT;?>-->这样的模板文件,其实就是一个标准的,可以执行的PHP文件。但是,这样的PHP文件,其HTML样式在DreamWeaver中可以正确的显示出来,所有的PHP代码会被看做HTML注释,而且在输出的时候,不会输出出来。比如,上面的文件在DreamWeaver中,被显示成:PHP代码如下:Hello,$name!这样,在设计页面的时候,我们就可以借助DW的可视化界面,进行一些界面的修改,美化等工作。尽管没有实现完全的代码和HTML的分离,但至少提供了一种辅助性的设计手段。
2023年08月07日
10 阅读
0 评论
0 点赞
2023-08-07
编写更高性能的PHP代码
编写更高性能的PHP代码PHP4.2版本以后,使用mt_rand() 代替rand()函数2.使用echo代替printfor结构可以这样写for ($i=0, $j = count($citys); $i < $j ; $i++)4.挂起进程的三个函时顺函数nanosleep, usleep, sleep.5.include, include_one, require, require_once包含文件的时候,尽量使用绝对路径。比如define('DOCUMNET_ROOT', dirname(__FILE__));require DOCUMENT_ROOT . '/common.inc';6.尽量避免使用str_replace(),尤其是preg_replace()6.1, stripos(‘http://’, $website)比preg_match(‘/http:\/\//i’, $website)快.6.2, ctype_alnum()比preg_match(‘/^\s*$/’);快6.3, if ($test == (int)$test)比preg_match(‘/^\d*$/)快6.4, if (!strncasecmp(“foo_”, “FoO_”, 4))比if (preg_match(“!^foo_!i”, “FoO_”))快6.5, if (strpbrk(“a8f9″, “sometext”))比if (preg_match(“![a8f9]!”, “sometext”))快.7.不要使用$row[id],应该使用$row['id']8.尽量少用错误抑制符(@)。除非特别情况,比如:$success = db_query("INSERT INTO users (uid, name) VALUES (2, 't')");if (!$success) { db_query("UPDATE users SET name = 't' WHERE uid = 2");}9.不要泛滥地使用global 变量,尤其要避免使用global 变量来替代local变量使用is_file()的效率比file_exists()更高11.通过&引用访问多维数组<?php$a'b' = array();// slow 2 extra hash lookups per accessfor($i = 0; $i < 5; $i++) { $a['b']['c'][$i] = $i;}// much faster reference based approach$ref =& $a'b';for($i = 0; $i < 5; $i++) {$ref[$i] = $i;}
2023年08月07日
35 阅读
0 评论
0 点赞
2023-08-07
一些PHP Coding Tips(php小技巧)
一些PHP Coding Tips(php小技巧)使用list来实现一次获取explode后的特定段值:list( , $mid) = explode(';', $string);使用NULL === 来代替is_null:is_null和 NULL === 完全是一样的效果, 但是却节省了一次函数调用.使用===尽量不用==:PHP有俩组相等比较运算符===/!==和==/!=, ==/!=会有隐式类型转换,而===/!==会严格比较俩个操作时是否类型相同并且值相等.我们应该尽量使用===而不是==, 除了因为转换规则比较难记以外, 还有一点就是如果使用===, 对于日后的维护或者阅读你代码的人也会很舒服:”在这个时刻, 这一行语句, 这个变量就是这个类型的!”.少用/不用 continue:continue是回到循环的头部, 而循环结束本来就是回到循环的头部, 所以通过适当的构造, 我们完全可以避免使用这条语句, 使得效率得到改善.警惕switch/in_array等的松比较(loose comparision):switch和in_array都是采用松比较, 所以在要比较的变量之间类型不一样的时候, 很容易出错:复制代码 代码如下:switch ($name) {case "laruence":...break;case "eve":...break;}对于上面的switch, 如果$name是数字0, 那么它会满足任何一条case. 同理在in_array中也是.解决的办法就是, 在switch之前, 把变量类型转换成你所期望的类型.复制代码 代码如下:switch (strval($name)) {case "laruence":...break;case "eve":...break;}而, in_array提供了第三个可选的参数, 通过这个参数可以改变默认的比较方式.switch不仅仅只用来判别变量:比如, 对于如下的一段代码:复制代码 代码如下:if($a) {} else if ($b) {} else if ($c || $d) {}可以简单的改写为:复制代码 代码如下:switch (TRUE) {case $a:break;case $b:break;case $c:case $d:break;}是不是看起来更清晰呢?变量先定义后使用:使用一个未定义的变量, 比使用一个定义好的变量要慢8倍以上!可以相像, PHP引擎会首先按照正常的逻辑来获取这个变量, 然而这个变量不存在, 所以PHP引擎需要抛出一个NOTICE, 并且进入一段使用未定义变量时应该走的逻辑, 然后返回一个新的变量.另外, 阅读代码的角度讲, 当你使用一个未定义的变量时, 会让阅读你代码的人困惑:”这个变量在那里初始化的, 和之前的代码有关系么? 和include进来的文件有关系么?”最后, 从规范编程的角度来讲, 你也需要这样做.不用第三变量交换俩个变量的值:list($a, $b) = array($b, $a),但其实还是有匿名临时变量的产生, 对于整数来说, 采用互逆的运算来做, 还是比较靠谱:复制代码 代码如下:$a = $a + $b;$b = $a - $b;$a = $a - $b;不过, 还是用异或比较好, 因为+ – * /容易产生精度丢失或者溢出.floor == 俩次非运算(此条由skiyo提供)复制代码 代码如下:echo ~~4.9;echo floor(4.9);用俩次非运算的速度基本上是floor的3倍, 不过有一点, 对于大数来说, 可能会发生溢出:复制代码 代码如下:echo ~~99999999999999.99; //276447231echo floor(99999999999999.99); //99999999999999do{}while(0)妙用(此条由Qianfeng提供)我们知道do{}while(0)在c/c++中, 有很多妙用, 比如消除goto, 宏定义代码块.所以, PHP中同理, 也可以用do{}while(0)来做一些巧妙的应用复制代码 代码如下:do{if(true) {break;}if(true) {break;}} while(false);//好过if(true) {} else if(true) {} else {}尽量少用@错误抑制符如下代码:复制代码 代码如下:@func();就相当于(参见深入理解PHP原理之错误抑制与内嵌HTML):复制代码 代码如下:$report = error_reporting(0);func();error_reporting($report);另外错误抑制符号, 可能会造成一些问题, 参看(http://www.fengfly.com);最后,错误抑制符在发生错误调试的时候也可能会带来麻烦.尽量避免使用递归(此条来自lazyboy)递归性能堪忧, 而大部分的递归都是尾递归, 都是可以消除的.复制代码 代码如下:function f($n) {if ($n = 0) return 1;return $n * f($n - 1);}//变为:$result = 1;for ($y = 1; $y < $n + 1; $y++ ) {$result *= $y;}使用$_SERVER['REQUEST_TIME']代替time()time()会引来一次函数调用, 而如果对时间的精确值要求不高, 可以使用$_SERVER['REQUEST_TIME']代替, 快很多.避免在for判断条件中做运算(此条来自留言的Anonymous)如下的代码:for($i=0; $i<strlen($str); $i++) {}会导致每次循环都调用strlen, 改为for ($i=0, $j=strlen($str); $i<$j; $i++) {}尽量避免使用正则(此条来自pangyontao)正则耗时, 尽量避免, 而采用直接的字符串处理函数代替, 如:复制代码 代码如下:if (preg_match("!^foo_!i", "FoO_")) { }// 替换为:if (!strncasecmp("foo_", "FoO_", 4)) { }if (preg_match("![a8f9]!", "sometext")) { }// 替换为:if (strpbrk("a8f9", "sometext")) { }if (preg_match("!string!i", "text")) {}// 替换为:if (stripos("text", "string") !== false) {}等等.用大括号括起在双引号和heredoc中的变量如下的代码:echo "$name[2]";PHP不知道程序员的意图是$name . “[2]“还是$name[2],所以建议, 都加上大括号:复制代码 代码如下:echo "{$name}[2]";//或者echo "${name}[2]";用FALSE表示错误, 用NULL表示不存在.对于操作类的函数, 失败返回FALSE, 表示”操作失败了”, 而对于查询类的函数, 如果找不到想要的值, 则应该返回NULL, 表示”找不到”.
2023年08月07日
16 阅读
0 评论
0 点赞
2023-08-07
php 静态变量
php 静态变量什么是静态变量? 静态变量是指 用static声明的变量,这种变量与局部变量的区别是,当静态变量离开了它的作用范围后,它的值不会自动消亡,而是继续存在,当下次再用到它的时候,可以保留最近一次的值。 下面举例:<?php function add() { static $i=0; $i++; echo $i; } add(); echo " "; add(); ?>这段程序中,主要定义了一个函数add(),然后分两次调用add()。如果用局部变量的方式来分工这段代码,两次的输出应该都是1。但实际输出却是1和2。这是因为,变量i在声明的时候被加上了一个修饰符static,这就标志着i变量在add()函数内部就是一个静态变量了,具备记忆自身值的功能,当第一次调用add时,i由于自加变成了1,这个时候,i就记住自己不再是0,而是1了,当我们再次调用add时,i再一次自加,由1变成了2。由此,我们就可以看出静态变量的特性了。
2023年08月07日
14 阅读
0 评论
0 点赞
2023-08-07
PHP 序列化变量的 4 种方法
PHP 序列化变量的 4 种方法序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。serialize和unserialize函数这两个是序列化和反序列化PHP中数据的常用函数。 $a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组 $s = serialize($a); echo $s; //输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";} echo ''; //反序列化 $o = unserialize($s); print_r($o);当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。PHP代码$obj = array();//序列化$s = base64_encode(serialize($obj));//反序列化$original = unserialize(base64_decode($s));但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。//定义一个用来序列化对象的函数 function my_serialize( $obj ) { return base64_encode(gzcompress(serialize($obj))); } //反序列化 function my_unserialize($txt) { return unserialize(gzuncompress(base64_decode($txt))); }json_encode 和 json_decode使用JSON格式序列化和反序列化是一个不错的选择:使用json_encode和json_decode格式输出要serialize和unserialize格式快得多。JSON格式是可读的。JSON格式比serialize返回数据结果小。JSON格式是开放的、可移植的。其他语言也可以使用它。$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组 $s = json_encode($a); echo $s; //输出结果:{"a":"Apple","b":"banana","c":"Coconut"} echo ''; //反序列化 $o = json_decode($s);在上面的例子中,json_encode输出长度比上个例子中serialize输出长度显然要短。var_export 和 evalvar_export 函数把变量作为一个字符串输出;eval把字符串当成PHP代码来执行,反序列化得到最初变量的内容。$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组 $s = var_export($a , true); echo $s; //输出结果: array ( 'a' => 'Apple', 'b' => 'banana', 'c' => 'Coconut', ) echo ''; //反序列化 eval('$my_var=' . $s . ';'); print_r($my_var);wddx_serialize_value 和 wddx deserializewddx_serialize_value函数可以序列化数组变量,并以XML字符串形式输出。$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组 $s = wddx_serialize_value($a); echo $s; //输出结果(查看输出字符串的源码):<header/>ApplebananaCoconut echo ''; //反序列化 $o = wddx_deserialize($s); print_r($o);//输出结果:Array ( [a] => Apple => banana 1 => Coconut )可以看出,XML标签字符较多,导致这种格式的序列化还是占了很多空间。结论上述所有的函数在序列化数组变量时都能正常执行,但运用到对象就不同了。例如json_encode序列化对象就会失败。反序列化对象时,unserialize和eval将有不同的效果。
2023年08月07日
13 阅读
0 评论
0 点赞
1
...
4
5
6