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

 百家乐-前端     |      2020-02-01 19:11

本文由码农网 – 小峰原创翻译,转发请看清文末的转发必要,款待出席大家的付费投稿安插!

正文介绍部分关于校勘和优化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,那撤销了绝大大多的主题素材,但您最佳依旧精通那件事,倘令你的应用程序使用各种语言的话。

先介绍那12个才能,剩下的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"; } }

lom599乐百家手机 ,还要在服务器上,你能够那样做:

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。只要让函数变得灵活起来使之能力所能达到选择差异的参数就可以。请看: