个对初学者非常有用的PHP技巧,10个对初学者非常有用的PHP技巧_php技巧_脚本之家

本文由码农网 –
小峰原创翻译,转发请看清文末的转载必要,应接加入咱们的付费投稿陈设!

本文介绍部分关于改正和优化PHP代码的提示和本事,供大家参照他事他说加以考察,具体内容如下

今天大家要介绍部分关于改良和优化PHP代码的升迁和才具。请小心,这几个PHP本事适用于初读书人,并不是那一个已经在应用MVC框架的人。

1.决不使用相对路线,要定义贰个根路线

永利澳门游戏网站 1

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

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

之所以今后,就算你将项目转移到一个不风流倜傥的目录,比如将其活动到二个在线的服务器上,这么些代码没有必要改变就足以运作。

1)、它首先寻找php满含路线中的钦命目录,然后查看当前目录。由此,会检查繁多索引。2)、当二个剧本被含有在另二个剧本的两样目录中时,它的骨干目录变为带有脚本的目录。3)、另四个标题是,当一个本子从cron运营时,它可能不会将它的父目录作为工作目录。所以选拔相对路径便成为了二个好措施:

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内容等的文书。
define('ROOT' , '/var/www/project/');require_once(ROOT . '../../lib/some_class.php');//rest of the code

永利澳门游戏网站,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";
    }    
}

那就是二个相对路线,並且会直接维持不改变。可是,大家得以更进一层改良。目录/var/www/project可以变,那么大家每一回都要改吗?

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>

不,使用魔术常量如__FILE__能够让它变得可移植。请紧凑看:

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

好了,今后同生机勃勃的函数就可以担负差异类型的出口了。以上代码能够运用到好些个地点让你的代码越来越灵敏。

//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

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

那般更好。

为此将来,就算你将品种转移到二个不及的目录,例如将其运动到二个在线的服务器上,那些代码无需校勘就能够运营。

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在左边栏或在荧屏中间的四方中呢?你驾驭为啥会现出这种气象吧?因为管理进度和出口被混合在了生龙活虎道。

2.不使用require,包括require_once或include_once

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

你的台本上可能会席卷各个文件,如类库,实用程序文件和帮扶函数等,就疑似这个:

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

只要您总是到数据库,无妨设置连接字符集。当你在您的应用程序中接纳各个语言时,那纯属有供给。

再不会发生什么样啊?你会在非斯洛伐克语文本中观望非常多的正方和????????。

require_once;require_once;require_once('helpers/utitlity_functions.php');

10.施用带有正确字符集选项的htmlentities

PHP 5.4此前,使用的暗许字符编码是ISO-8859-1,这不能够呈现比方À â
那样的字符。

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

从PHP
5.4起,默许编码成了UTF-8,那消弭了大多数的题目,但你最佳恐怕清楚那事,如若您的应用程序使用二种语言的话。

先介绍那13个技术,剩下的PHP技艺大家将在接下去的稿子中为我们大饱眼福,多谢您的读书。

这一定粗糙。代码必要更加灵敏。写好救助函数可以更易于地蕴藏东西。举例:

function load_class{ //path to the class file $path = ROOT . '/lib/' . $class_name . '.php'); require_once; }load_class;load_class;

来看有别于了吧?很显著。没有要求其余更加多的分解。

function load_class{ //path to the class file $path = ROOT . '/lib/' . $class_name . '.php'); if { require_once; }}

如此那般做能够产生比比较多事情:

为同一个类公事寻找三个目录。轻易改革包罗类文件的目录,而不破坏别之处的代码。使用形似的函数用于加载包罗帮忙函数、HTML内容等的文书。

3.在应用程序中维护调节和测量试验遭逢

在支付进程中,大家echo数据库查询,转储创制难点的变量,然后黄金时代旦难题被解决,大家讲解它们或删除它们。但让全部留在原地可提供长效帮扶。

在支付计算机上,你能够这么做:

define('ENVIRONMENT' , 'development');if(! $db->query{ if(ENVIRONMENT == 'development') { echo "$query failed"; } else { echo "Database error. Please contact administrator"; } }

再便是在服务器上,你能够这么做:

define('ENVIRONMENT' , 'production');if(! $db->query{ if(ENVIRONMENT == 'development') { echo "$query failed"; } else { echo "Database error. Please contact administrator"; } }

4.通过会话传播景况信息

处境新闻是那几个实践职责后变化的音信。

如此的代码很分布。使用变量来体现状态新闻有自然的局限性。因为它们无法透过重定向发送(除非您将它们作为GET变量传播给下三个剧本,但那极度愚昧)。况兼在巨型脚本中大概会有八个新闻等。

最棒的方式是选取会话来传播。想要那样做的话在各个页面上必得得有一个session_start。

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

Status is : 

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

当增添单一条目款项时,使用方面的函数。那么当增加两个条款时,就得创设另三个函数吗?NO。只要让函数变得灵活起来使之能力所能达到担任不一样的参数就能够。请看:

发表评论

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