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

 Web前端     |      2020-03-10 17:27

本文由码农网 – 小峰原创翻译,转发请看清文末的转发供给,应接参加我们的付费投稿安顿!

正文介绍一些关于改善和优化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,那化解了绝大好些个的难题,但您最佳或许清楚那事,如若您的应用程序使用八种语言的话。

先介绍那11个技巧,剩下的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。只要让函数变得灵活起来使之力所能致选取区别的参数就可以。请看: