[php源码]高质量PHP代码的50个实用技能必备(上)

  • A+
所属分类:asp程序
摘要

50个高质量PH小白源码资源站代码的实用技能,欲望大年夜家爱好。1.不要应用相对门路经常会看到:require_once(‘/lib/some_class.php’);该方法有很多缺点:它起首查找指定的php包罗门路,然后查找以后目次。因此会检查过量门路。假设该脚本被另外一目次的脚本包罗,它的基本目次酿成了小白源码资源站了另外一脚本地点的目次.另外

50个高质量PH小白源码资源站http://www.526bt.com/account?__preferral=41b2453033.2042HP代码的实用技能,欲望大年夜家爱好。

1.不要应用相对门路
经常会看到:

require_once('/lib/some_class.php');
该方法有很多缺点: 它起首查找指定的php包罗门路, 然后查找以后目次。因此会检查过量门路。假设该脚本被另外一目次的脚本包罗, 它的基本目次酿成了小白源码资源站http://www.526bt.com/account?__preferral=41b2453033.2042了另外一脚本地点的目次.

另外一后果, 当按时义务运转该脚本, 它的下级目次能够就不是任务目次了。因此最好选择是应用相对门路:
view sourceprint? define('ROOT' , '/var/'); require_once(ROOT . '/lib/some_class.php'); //rest of the code
我们定义了一个相对门路, 值被写逝世了. 我们还可以改良它. 门路 /var/ 也能够会修改, 那么我们每次都要修改它吗? 不是的, 我们可以应用__FILE__常量, 如:
//suppose your script is /var/ //Then __FILE__ will always have that full path. define('ROOT' , pathinfo(__FILE__, PATHINFO_DIRNAME)); require_once(ROOT . '/lib/some_class.php'); //rest of the code
现在, 不管你移到哪个目次, 如移到一个外网的效劳器上, 代码不必更改便可准确运转.

2. 不要直接应用 require, include, include_once, required_once
可以在脚本头部引入多个文件, 像类库, 对象文件和助手函数等, 如:
require_once('lib/Database.php'); require_once('lib/Mail.php'); require_once('helpers/utitlity_functions.php');
这类用法相当原始. 应当更灵敏点. 应编写个助手函数包罗文件. 例如:
function load_class($class_name) { //path to the class file $path=ROOT . '/lib/' . $class_name . '.php'); require_once( $path ); } load_class('Database'); load_class('Mail');
有甚么纷歧样吗? 该代码更具可读性。將来你可以按需扩大该函数, 如:
function load_class($class_name) { //path to the class file $path=ROOT . '/lib/' . $class_name . '.php'); if(file_exists($path)) { require_once( $path ); } }
还可做得更多: 为异样文件查找多个目次。能很轻易的修改放置类文件的目次, 不必在代码遍地一一修改。可应用相似的函数加载文件, 如html内容.

3. 为应用保管调试代码
在开辟情况中, 我们打印数据库查询语句, 转存有后果的变量值, 而一旦后果处理, 我们注释或删除它们. 然则更好的做法是保管调试代码。在开辟情况中, 你可以:
define('ENVIRONMENT' , 'development'); if(! $db->query( $query ) { if(ENVIRONMENT=='development') { echo "$query failed"; } else { echo "Database error. Please contact administrator"; } }
在效劳器中, 你可以:
define('ENVIRONMENT' , 'production'); if(! $db->query( $query ) { if(ENVIRONMENT=='development') { echo "$query failed"; } else { echo "Database error. Please contact administrator"; } }
4. 应用可跨平台的函数履行敕令
system, exec, passthru, shell_exec 这4个函数可用于履行系统敕令. 每个的行动都有纤细差异. 后果在于, 当在共享主机中, 某些函数能够被选择性的禁用. 大年夜少数新手趋于每次起首检查哪个函数可用, 然则再应用它。更好的计划是封成函数一个可跨平台的函数.

function terminal($command) { //system if(function_exists('system')) { ob_start(); system($command , $return_var); $output=ob_get_contents(); ob_end_clean(); } //passthru else if(function_exists('passthru')) { ob_start(); passthru($command , $return_var); $output=ob_get_contents(); ob_end_clean(); } //exec else if(function_exists('exec')) { exec($command , $output , $return_var); $output=implode("\n" , $output); } //shell_exec else if(function_exists('shell_exec')) { $output=shell_exec($command) ; } else { $output='Command execution not possible on this system'; $return_var=1; } return array('output'=> $output , 'status'=> $return_var); } terminal('ls');
下面的函数將运转shell敕令, 只需有一个系统函数可用, 这保持了代码的不合性.

5. 灵敏编写函数
function add_to_cart($item_id , $qty) { $_SESSION['cart']['item_id']=$qty; } add_to_cart( 'IPHONE3' , 2 );
应用下面的函数添加单个项目. 而当添加项列表的时分,你要创立另外一个函数吗? 不用, 只需略加留心分歧类型的参数, 就会更灵敏. 如:
function add_to_cart($item_id , $qty) { if(!is_array($item_id)) { $_SESSION['cart']['item_id']=$qty; } else { foreach($item_id as $i_id=> $qty) { $_SESSION['cart']['i_id']=$qty; } } } add_to_cart( 'IPHONE3' , 2 ); add_to_cart( array('IPHONE3'=> 2 , 'IPAD'=> 5) );
现在, 同个函数可以处理分歧类型的输入参数了. 可以参照下面的例子重构你的多处代码, 使其更智能.

6. 成心疏忽php封闭标签
我很想知道为甚么这么多关于php建议的博客文章都没提到这点.

//super extra character after the closing tag

index.php

require_once('super_class.php'); //echo an image or pdf , or set the cookies or session data
如许, 你將会掉掉落一个 Headers already send error. 为甚么? 因为 “super extra character” 曾经被输入了. 现在你得末尾调试啦. 这会破费少量时间寻觅 super extra 的位置。因此, 养成省略封闭符的习惯:

Site Log and Login links

"; } function print_footer() { echo "

"; } print_header(); for($i=0 ; $i < 100; $i++) { echo "I is : $i '; } print_footer(); 替换计划, 在某中央集中汇集输入. 你可以存储在函数的局部变量中, 也能够应用ob_start和ob_end_clean. 以下: function print_header() { $o="

"; return $o; } function print_footer() { $o="

"; return $o; } echo print_header(); for($i=0 ; $i < 100; $i++) { echo "I is : $i '; } echo print_footer(); 为甚么需求输入缓冲: >>可以在发送给浏览器前更改输入. 如 str_replaces 函数或能够是 preg_replaces 或添加些监控/调试的html内容.
>>输入给浏览器的同时又做php的处理很蹩脚. 你应当看到过有些站点的侧边栏或中间出现毛病信息. 知道为甚么会爆发吗? 因为处理和输入混淆了.

8. 发送准确的mime类型头信息, 假设输入非html内容的话.
输入一些xml.

$xml=''; $xml=" 0 "; //Send xml data echo $xml;
任务得不错. 但需求一些改良.

$xml=''; $xml=" 0 "; //Send xml data header("content-type: text/xml"); echo $xml;
留心header行. 该行告诉浏览器发送的是xml类型的内容. 所以浏览器能准确的处理. 很多的javascript库也依附头信息.
相似的有 javascript , css, jpg image, png image:

JavaScript header("content-type: application/x-javascript"); echo "var a=10"; CSS header("content-type: text/css"); echo "#div id { background:#000; }";
9. 为mysql连接设置准确的字符编码
曾经碰到过在mysql表中设置了unicode/utf-8编码, phpadmin也能准确显示, 但当你获得内容并在页面输入的时分,会出现乱码. 这里的后果出在mysql连接的字符编码.

//Attempt to connect to database $c=mysqli_connect($this->host , $this->username, $this->password); //Check connection validity if (!$c) { die ("Could not connect to the database host: ". mysqli_connect_error()); } //Set the character set of the connection if(!mysqli_set_charset ( $c , 'UTF8' )) { die('mysqli_set_charset() failed'); }
一旦连接数据库, 最好设置连接的 characterset. 你的应用假设要支撑多言语, 这么做是必须的.

10. 应用 htmlentities 设置准确的编码选项
php5.4前, 字符的默许编码是ISO-8859-1, 不能直接输入如à a等.
$value=htmlentities($this->value , ENT_QUOTES , CHARSET);
php5.4以后, 默许编码为UTF-8, 这將处理很多后果. 但假设你的应用是多言语的, 依然要留心编码后果,.

11. 不要在应用中应用gzip压缩输入, 让apache处理
思考过应用 ob_gzhandler 吗? 不要那样做. 毫成心义. php只应用来编写应用. 不应操心效劳器和浏览器的数据传输优化后果.
应用apache的mod_gzip/mod_deflate 模块压缩内容.

12. 应用json_encode输入静态javascript内容
经常会用php输入静态javascript内容:

$images=array( 'myself.png' , 'friends.png' , 'colleagues.png' ); $js_code=''; foreach($images as $image) { $js_code .="'$image' ,"; } $js_code='var images=[' . $js_code . ']; '; echo $js_code; //Output is var images=['myself.png' ,'friends.png' ,'colleagues.png' ,]; 更聪慧的做法, 应用 json_encode: $images=array( 'myself.png' , 'friends.png' , 'colleagues.png' ); $js_code='var images=' . json_encode($images); echo $js_code; //Output is : var images=["myself.png","friends.png","colleagues.png"]
优雅乎?

13. 写文件前, 检查目次写权限
写或保管文件前, 确保目次是可写的, 假设不成写, 输入毛病信息. 这会浪费你很多调试时间. linux系统中, 需求处理权限, 目次权限不妥会招致很多很多的后果, 文件也有能够没法读取等等.
确保你的应用足够智能, 输入某些主要信息.

$contents="All the content"; $file_path="/var/"; file_put_contents($file_path , $contents);
这大年夜体上准确. 但有些直接的后果. file_put_contents 能够会因为几个启事掉败:
>>父目次不存在
>>目次存在, 但不成写
>>文件被写锁住?
所以写文件前做明确的检查更好.

$contents="All the content"; $dir='/var/'; $file_path=$dir . "/content.txt"; if(is_writable($dir)) { file_put_contents($file_path , $contents); } else { die("Directory $dir is not writable, or does not exist. Please check"); }
这么做后, 你会掉掉落一个文件在何处写及为甚么掉败的明确信息.

14. 更改应用创立的文件权限
在linux情况中, 权限后果能够会糜费你很多时间. 从今往后, 不管甚么时候, 当你创立一些文件后, 确保应用chmod设置准确权限. 否则的话, 能够文件先是由”php”用户创立, 但你用其它的用户登录任务, 系统將会拒绝访问或翻开文件, 你不能不奋力获得root权限, 更改文件的权限等等.

// Read and write for owner, read for everybody else chmod("/somedir/somefile", 0644); // Everything for owner, read and execute for others chmod("/somedir/somefile", 0755);
15. 不要依附submit按钮值来检查表单提交行动

if($_POST['submit']=='Save') { //Save the things }
下面大年夜少数状况准确, 除应用是多言语的. ‘Save' 能够代表其它含义. 你如何辨别它们呢. 因此, 不要依附于submit按钮的值.
if( $_SERVER['REQUEST_METHOD']=='POST' and isset($_POST['submit']) ) { //Save the things }
现在你从submit按钮值中解脱出来了.

16. 为函数内总具有相反值的变量定义成静态变量

//Delay for some time function delay() { $sync_delay=get_option('sync_delay'); echo "Delaying for $sync_delay seconds..."; sleep($sync_delay); echo "Done "; }
用静态变量代替:
//Delay for some time function delay() { static $sync_delay=null; if($sync_delay==null) { $sync_delay=get_option('sync_delay'); } echo "Delaying for $sync_delay seconds..."; sleep($sync_delay); echo "Done "; }
17. 不要直接应用 $_SESSION 变量
某些复杂例子:

$_SESSION['username']=$username; $username=$_SESSION['username'];
这会招致某些后果. 假设在同个域名中运转了多个应用, session 变量能够会抵触. 两个分歧的应用能够应用统一个session key. 例如, 一个前端门户, 和一个后台办理系统应用统一域名。从现在末尾, 应用应用相干的key和一个包装函数:
define('APP_ID' , 'abc_corp_ecommerce'); //Function to get a session variable function session_get($key) { $k=APP_ID . '.' . $key; if(isset($_SESSION[$k])) { return $_SESSION[$k]; } return false; } //Function set the session variable function session_set($key , $value) { $k=APP_ID . '.' . $key; $_SESSION[$k]=$value; return true; }
18. 將对象函数封装到类中
假设你在某文件中定义了很多对象函数:

function utility_a() { //This function does a utility thing like string processing } function utility_b() { //This function does nother utility thing like database processing } function utility_c() { //This function is ... }
这些函数的应用分散到应用遍地. 你能够想將他们封装到某个类中:

class Utility { public static function utility_a() { } public static function utility_b() { } public static function utility_c() { } } //and call them as $a=Utility::utility_a(); $b=Utility::utility_b();
显而易见的益处是, 假设php内建有同名的函数, 如许可以防止抵触.
另外一种看法是, 你可以在同个应用中为同个类保护多个版本, 而不招致抵触. 这是封装的基本益处, 无它.

19. Bunch of silly tips
>>应用echo代替print
>>应用str_replace代替preg_replace, 除非你相对需求
>>不要应用 short tag
>>复杂字符串用单引号代替双引号
>>head重定向后记得应用exit
>>不要在轮回中调用函数
>>isset比strlen快
>>始中如一的格局化代码
>>不要删除轮回或许if-else的括号
不要如许写代码:

if($a==true) $a_count++;
这相对WASTE。写成:

if($a==true) { $a_count++; }
不要测验测验省略一些语法来延长代码. 而是让你的逻辑冗杂.
>>应用有高亮语法显示的文本编辑器. 高亮语法能让你增加毛病.

20. 应用array_map快速处理数组
比如说你想 trim 数组中的一切元素. 新手能够会:
foreach($arr as $c=> $v) { $arr[$c]=trim($v); }
但应用 array_map 更复杂:
$arr=array_map('trim' , $arr);
这会为$arr数组的每个元素都恳求调用trim. 另外一个相似的函数是 array_walk. 请查阅文档进修更多技能.

21. 应用 php filter 验证数据
你必然曾应用过正则表达式验证 email , ip地址等. 是的,每团体都这么应用. 现在, 我们想做分歧的测验测验, 称为filter.
php的filter扩大供给了复杂的方法验证和检查输入.

22. 强制类型检查
$amount=intval( $_GET['amount'] ); $rate=(int) $_GET['rate'];
这是个好习惯.

23. 假设需求,应用profiler如xdebug
假设你应用php开辟大年夜型的应用, php承当了很多运算量, 速度会是一个很主要的目标. 应用profile协助优化代码. 可应用xdebug和webgrid.

24. 当心处理大年夜数组
关于大年夜的数组和字符串, 必须当心处理. 罕见毛病是爆发数组拷贝招致内存溢出,抛出Fatal Error of Memory size 信息:
$db_records_in_array_format; //This is a big array holding 1000 rows from a table each having 20 columns , every row is atleast 100 bytes , so total 1000 * 20 * 100=2MB $cc=$db_records_in_array_format; //2MB more some_function($cc); //Another 2MB ?
当导入或导出csv文件时, 经常会这么做。不要认为下面的代码会经常因内存限制招致脚本解体. 关于小的变量是没后果的, 但处理大年夜数组的时分就必须防止.
确保经过援用传递, 或存储在类变量中:
$a=get_large_array(); pass_to_function(&$a);
这么做后, 向函数传递变量援用(而不是拷贝数组). 检查文档.

class A { function first() { $this->a=get_large_array(); $this->pass_to_function(); } function pass_to_function() { //process $this->a } }
尽快的 unset 它们, 让内存得以释放,减轻脚本担当.

25. 由始至终应用单一数据库连接
确保你的脚本由始至终都应用单一的数据库连接. 在末尾处准确的翻开连接, 应用它直到完毕, 最后封闭它. 不要像下面如许在函数中翻开连接:

function add_to_cart() { $db=new Database(); $db->query("INSERT INTO cart ....."); } function empty_cart() { $db=new Database(); $db->query("DELETE FROM cart ....."); }
应用多个连接是个蹩脚的, 它们会拖慢应用, 因为创立连接需求时间和占用内存。特定状况应用单例形式, 如数据库连接.。

这个秘笈是否是很出色,置信必然对大年夜家进修php依次设计有所协助。

分享当前页面将至少获得10%佣金,点此获取推广链接(规则说明)。

本站VIP源码资源永久免费下载!持续更新!www.526bt.com

加入999永久VIP会员带做项目包赚钱!教引流包搭建,社群资源共享!

新项目更新通知QQ群:767688774 站长技术交流QQ群:552760713

点击这里给我发消息

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin