非常有用的,个对初学者非常有用的PHP技巧【永利澳门游戏网址304】

本文由码农网 –
小峰原创翻译,转发请看清文末的转载供给,接待出席大家的付费投稿布署!

1. 永不接受相对路线,要定义叁个根路线

如此那般的代码行很布满:

require_once('../../lib/some_class.php');

这种艺术有无数缺欠:

  • 它首先搜索 php
    蕴涵路线中的钦定目录,然后查看当前目录。由此,会检查大多目录。
  • 当一个剧本被含有在另贰个剧本的例外目录中时,它的大旨目录变为带有脚本的目录。
  • 另一个标题是,当二个剧本从 cron
    运营时,它或然不会将它的父目录作为专门的学业目录。

就此利用相对路线便成为了多个好办法:

define('ROOT' , '/var/www/project/');
require_once(ROOT . '../../lib/some_class.php');

//rest of the code

那就是二个相对路线,况兼会间接维持不改变。可是,我们得以更进一层校正。目录 /
var/www/project 能够变,那么大家每回都要改吧?

不,使用魔术常量如FILE能够让它变得可移植。请留心看:

//suppose your script is /var/www/project/index.php
//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

之所以以往,即便你将品种转移到二个两样的目录,比如将其活动到多少个在线的服务器上,那么些代码不要求改换就能够运维。

接上一篇:40+个对初读书人特别常有效的PHP技艺(一)

2. 不使用 require,包括 require_once 或 include_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 内容等的文本。

11.毫无在您的应用程序中gzip输出,让apache来做

杜撰使用ob_gzhandler?不,别这么做。它并未有别的意义。PHP应该是来写应用程序的。不要记挂PHP中关于如何优化在服务器和浏览器之间传输的数额。

使用apache mod_gzip/mod_deflate通过.htaccess文件裁减内容。

3. 在应用程序中维护调节和测验情况

在支付进度中,大家 echo
数据库查询,转储创立难题的变量,然后要是难题被解决,我们讲解它们或删除它们。但让总体留在原地可提供长效帮扶。

在支付Computer上,你能够这么做:

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";
    }    
}

12.从php echo javascript代码时利用json_encode

稍加时候某些JavaScript代码是从php动态变化的。

$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"]

那不是很干净?

4. 通过会话传播情形音讯

动静音讯是那多少个奉行义务后变卦的新闻。

<?php
if($wrong_username || $wrong_password)
{
    $msg = 'Invalid username or password';
}
?>
<html>
<body>

<?php echo $msg; ?>

<form>
...
</form>
</body>
</html>

这么的代码很广阔。使用变量来体现状态音讯有一定的局限性。因为它们不能透过重定向发送(除非你将它们作为
GET
变量传播给下三个剧本,但那卓殊愚笨)。而且在大型脚本中或者会有多少个音信等。

最佳的章程是选拔会话来传播(就算是在同一页面上)。想要这样做的话在种种页面上必须得有一个session_start。

function set_flash($msg)
{
    $_SESSION['message'] = $msg;
}

function get_flash()
{
    $msg = $_SESSION['message'];
    unset($_SESSION['message']);
    return $msg;
}

在您的剧本中:

<?php
if($wrong_username || $wrong_password)
{
    set_flash('Invalid username or password');
}
?>
<html>
<body>

Status is : <?php echo get_flash(); ?>
<form>
...
</form>
</body>
</html>

13.在写入任何文件以前检查目录是或不是可写

在写入或保存任何公文从前,请务供给检查该目录是或不是是可写的,倘使不行写的话,会闪烁错误消息。那将节约你多量的“调节和测验”时间。当您办事于Linux时,权限是应当要拍卖的,并且会有无数广大的权能难点时,当目录不可写,文件不能读取等的时候。

请保管您的应用程序尽或然智能化,并在最短的岁月内报告最关键的新闻。

$contents = "All the content";
$file_path = "/var/www/project/content.txt";

file_put_contents($file_path , $contents);

那完全精确。但有点直接的标题。file_put_contents大概会因为某些原由此小败:

  • 父目录不设有
  • 目录存在,但不足写
  • 锁定文件用于写入?

故而,在写入文件以前最佳能够100%都弄料定。

$contents = "All the content";
$dir = '/var/www/project';
$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");
}

通过如此做,你就能够获得哪儿文件写入战败以至为什么战败的纯粹音讯。

5. 让函数变得灵活

function add_to_cart($item_id , $qty)
{
    $_SESSION['cart'][$item_id] = $qty;
}

add_to_cart( 'IPHONE3' , 2 );

当增多单一条约时,使用方面包车型客车函数。那么当增加多少个条文时,就得创造另二个函数吗?NO。只要让函数变得灵活起来使之力所能及接收不一致的参数就可以。请看:

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) );

好了,以后一成不变的函数就能够采取区别品种的出口了。以上代码能够利用到多数地点让您的代码更灵活。

14.改换应用程序创设的文本的权位

当在Linux遭遇下办事时,权限管理会浪费你多多日子。因而,只要你的php应用程序创造了部分文件,那就应当纠正它们的权柄以保险它们在外围“一团和气”。否则,举个例子,文件是由“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);

6. 省略结束的 php 标签,要是它是本子中的最终一行

本人不明了干什么相当多博客小说在座谈 php 小技艺时要简明那么些手艺。

<?php

echo "Hello";

//Now dont close this tag

那足以扶持您省略大量主题素材。举五个例子:

类文件 super_class.php

<?php
class super_class
{
    function super_function()
    {
        //super code
    }
}
?>
//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

您会收获发送错误的 Header。为啥吗?因为
“比很多余字符”,全部标题都去处理这些去了。于是你得起来调节和测量检验。你恐怕必要浪费广大日子来搜寻超级额外的长空。

据此要养成省略甘休标签的习于旧贯:

<?php
class super_class
{
    function super_function()
    {
        //super code
    }
}

//No closing tag

如此那般越来越好。

15.绝不检查提交开关值来检查表单提交

if($_POST['submit'] == 'Save')
{
    //Save the things
}

如上代码在大超级多时候是科学的,除了应用程序使用多语言的气象。然后“Save”能够是无数莫衷一是的事物。那么您该怎样再做相比较?所以不可能信任提交按键的值。相反,使用那么些:

if( $_SERVER['REQUEST_METHOD'] == 'POST' and isset($_POST['submit']) )
{
    //Save the things
}

现行反革命您就能够抽身提交开关的值了。

7. 在叁个地点搜聚全部出口,然后一遍性输出给浏览器

那正是所谓的输出缓冲。例如说,你从差异的函数获得像这么的源委:

function print_header()
{
    echo "<div id='header'>Site Log and Login links</div>";
}

function print_footer()
{
    echo "<div id='footer'>Site was made by me</div>";
}

print_header();
for($i = 0 ; $i < 100; $i++)
{
    echo "I is : $i <br />';
}
print_footer();

实在您应有先在三个地点搜集所有出口。你能够要么将它存储于函数中的变量内部,要么接收ob_start 和 ob_end_clean。所以,今后应当看起来像这么

function print_header()
{
    $o = "<div id='header'>Site Log and Login links</div>";
    return $o;
}

function print_footer()
{
    $o = "<div id='footer'>Site was made by me</div>";
    return $o;
}

echo print_header();
for($i = 0 ; $i < 100; $i++)
{
    echo "I is : $i <br />';
}
echo print_footer();

那就是说,为何你应有做输出缓冲呢:

  • 您能够在将出口发送给浏览器此前更正它,假设您须要的话。比方做一些
    str_replaces,或者 preg_replaces,又或许是在结尾增加一些外加的
    html,比如 profiler/debugger 输出。
  • 出殡输出给浏览器,并在同期做 php
    管理并非好主意。你见过如此的网址,它有多少个 Fatal error
    在侧面栏或在显示器中间的四方中吗?你领会干什么会现身这种境况呢?因为处理进程和出口被混合在了协同。

永利澳门游戏网址304,16.在函数中连连有相像值的地点使用静态变量

//Delay for some time
function delay()
{
    $sync_delay = get_option('sync_delay');

    echo "<br />Delaying for $sync_delay seconds...";
    sleep($sync_delay);
    echo "Done <br />";
}

反而,使用静态变量:

//Delay for some time
function delay()
{
    static $sync_delay = null;

    if($sync_delay == null)
    {
    $sync_delay = get_option('sync_delay');
    }

    echo "<br />Delaying for $sync_delay seconds...";
    sleep($sync_delay);
    echo "Done <br />";
}

8. 当输出非 HTML 内容时,通过 header 发送准确的 mime 类型

请看一些 XML。

$xml = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>';
$xml = "<response>
  <code>0</code>
</response>";

//Send xml data
echo $xml;

做事不荒谬。但它须要有些修改。

$xml = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>';
$xml = "<response>
  <code>0</code>
</response>";

//Send xml data
header("content-type: text/xml");
echo $xml;

请留神 header 行。那行代码告诉浏览器这几个剧情是 XML
内容。由此,浏览器能够准确地拍卖它。好些个 JavaScript 库也都依附于 header
音信。

JavaScript,css,jpg 图片,png 图像也是同样:

JavaScript

header("content-type: application/x-javascript");
echo "var a = 10";

CSS

header("content-type: text/css");
echo "#div id { background:#000; }"

17.绝不直接使用$ _SESSION变量

一对简短的例证是:

$_SESSION['username'] = $username;
$username = $_SESSION['username'];

可是这有叁个主题材料。如若您正在相似域中运作三个应用程序,会话变量会爆发冲突。2个例外的应用程序在对话变量中恐怕会设置同一的键名。譬如,二个相通域的前端门户和后台管理应用程序。

由此,用包装函数使用应用程序特定键:

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;
}

9. 为 MySQL 连接装置科学的字符编码

曾碰着过 unicode/utf-8 字符被正确地囤积在 mysql 表的难题,phpmyadmin
也显得它们是对的的,然而当你使用的时候,你的网页上却并无法科学地呈现。里面包车型大巴奥秘在于
MySQL 连接核对。

$host = 'localhost';
$username = 'root';
$password = 'super_secret';

//Attempt to connect to database
$c = mysqli_connect($host , $username, $password);

//Check connection validity
if (!$c) 
{
    die ("Could not connect to the database host: <br />". mysqli_connect_error());
}

//Set the character set of the connection
if(!mysqli_set_charset ( $c , 'UTF8' ))
{
    die('mysqli_set_charset() failed');
}

假定你总是到数据库,不要紧设置连接字符集。当您在你的应用程序中动用种种语言时,那相对有必不可缺。

否则会爆发哪些啊?你会在不合规文文本中看见多数的方框和????????。

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有常常名称的松手函数,那么名称不会产生矛盾。

从另叁个角度看,你能够在形似的应用程序中维系七个版本的相同类,而不会发出其余冲突。因为它被打包了,正是如此。

10. 利用含有正确字符集选项的 htmlentities

PHP 5.4 此前,使用的暗中认可字符编码是 ISO-8859-1,那不可能显得比如 À â
那样的字符。

$value = htmlentities($this->value , ENT_QUOTES , 'UTF-8');

从 PHP 5.4 起,默许编码成了
UTF-8,那消除了大多数的标题,但您最佳如故理解这事,要是你的应用程序使用多样语言的话。

19.部分白痴式技术

  • 使用echo代替print
  • 使用str_replace代替preg_replace,除非您明确需求它
  • 永不采取short tags
  • 对此简易的字符串使用单引号代替双引号
  • 在header重定向之后要记得做一个exit
  • 纯属不要把函数调用放到for循环调整行中。
  • isset比strlen快
  • 准确和一模一样地格式化你的代码
  • 毫不错失循环或if-else块的括号。

决不写这么的代码:

if($a == true) $a_count++;

那相对是一种浪费。

这样写

if($a == true)
{
    $a_count++;
}

实际不是通过吃掉语法裁减你的代码。而是要让您的逻辑更简约。

  • 行使具有代码高亮作用的文件编辑器。代码高亮有扶持减弱不当。

11. 绝不在您的应用程序中 gzip 输出,让 apache 来做

设想使用 ob_gzhandler?不,别这么做。它未有其它意义。PHP
应该是来写应用程序的。不要操心 PHP
中有关怎么着优化在服务器和浏览器之间传输的数据。

使用 apache mod_gzip/mod_deflate 通过. htaccess 文件减少内容。

20. 使用array_map飞速管理数组

举例说,你要trim七个数组的兼具因素。生手会那样做:

foreach($arr as $c => $v)
{
    $arr[$c] = trim($v);
}

但它能够利用array_map变得更清新:

$arr = array_map('trim' , $arr);

这适用于trim数组$arr的持有因素。另三个近乎的函数是array_walk。

12. 从 php echo javascript 代码时行使 json_encode

有一点点时候有的 JavaScript 代码是从 php 动态变化的。

$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"]

那不是很卫生?

21.选拔php过滤器验证数据

您是或不是运用正则表明式来证明如电子邮件,IP地址等值?是的,各样人都以这么做的。今后,让大家试试多个例外的东西,那正是过滤器。

php过滤器扩充程序将提供轻便的办法来有效注脚或校验值。

13. 在写入任何文件从前检查目录是还是不是可写

在写入或保存任何文件以前,请务要求检查该目录是或不是是可写的,假设不行写的话,会闪烁错误新闻。那将节约你大量的
“调节和测量试验” 时间。当你工作于 Linux
时,权限是必要求管理的,而且会有众多过多的权限难题时,当目录不可写,文件不能够读取等的时候。

请保管您的应用程序尽恐怕智能化,并在最短的时日内部报纸告最关键的消息。

$contents = "All the content";
$file_path = "/var/www/project/content.txt";

file_put_contents($file_path , $contents);

那完全正确。但有一点点直接的主题素材。file_put_contents
也许会因为部分原因此停业:

  • 父目录不真实
  • 目录存在,但不足写
  • 锁定文件用于写入?

于是,在写入文件此前最棒能够百分百都弄明白。

$contents = "All the content";
$dir = '/var/www/project';
$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");
}

经过如此做,你就会获得哪个地方文件写入失利甚至为啥战败的准确音信。

发表评论

电子邮件地址不会被公开。 必填项已用*标注