金沙糖果派对网站app 1

金沙糖果派对网站app 1

好了,今后大器晚成致的函数就足以承担分裂品类的输出了。以上代码能够选择到不菲地点让您的代码越来越灵活。

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
有平日名称的嵌入函数,那么名称不会产生冲突。

从另三个角度看,你可以在同等的应用程序中维系多少个版本的相符类,而不会生出任何冲突。因为它棉被服装进了,正是那样。

24. 小心管理大数组 对于大的数组和字符串, 必需小心管理.
数见不鲜错误是产生数组拷贝引致内部存款和储蓄器溢出,抛出Fatal Error of Memory size 音讯:

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内容等的文书。

並且在服务器上,你能够如此做:

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

好了,现在同风流倜傥的函数就能够担任差别类型的出口了。以上代码能够运用到许多地点令你的代码更灵敏。

//super extra character after the closing tag

10.应用带有精确字符集选项的htmlentities

PHP 5.4早前,使用的暗中同意字符编码是ISO-8859-1,那不可能显示比方À â
那样的字符。

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

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

先介绍那10个技能,剩下的PHP技术我们将要接下去的稿子中为大家享用,谢谢您的读书。

require_once;//echo an image or pdf , or set the cookies or session data

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>
$contents = "All the content";$file_path = "/var/www/project/content.txt"; file_put_contents($file_path , $contents);

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

如此越来越好。

您能够在将出口发送给浏览器在此以前校正它,如若你需求的话。举个例子做一些str_replaces,或者preg_replaces,又可能是在最后增加一些极其的html,比如profiler/debugger输出。发送输出给浏览器,并在同有的时候候做php管理并不是好主意。你见过这样的网址,它有一个Fatal
error在左侧栏或在显示器中间的方框中呢?你精晓为啥会并发这种气象吗?因为处理进程和出口被混合在了联合。8.当输出非HTML内容时,通过header发送正确的mime类型

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; }"
if($_POST['submit'] == 'Save') { //Save the things }

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

好了,未来同意气风发的函数就可以接纳差异品种的出口了。以上代码能够运用到无数位置令你的代码更灵敏。

3.在应用程序中保养调节和测验境况

22. 威迫类型检查

$amount = intval( $_GET['amount'] );
$rate = (int) $_GET['rate'];

那是少年老成种好习贯。

$images = array( 'myself.png' , 'friends.png' , 'colleagues.png' );$js_code = '';foreach{$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; echo $js_code;//Output is : var images = ["myself.png","friends.png","colleagues.png"]

前日大家要介绍部分关于修改和优化PHP代码的唤醒和技能。请介怀,那一个PHP手艺适用于初读书人,并不是那多少个曾在利用MVC框架的人。

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

21. 采取 php 过滤器验证数据

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

php 过滤器扩充程序将提供轻巧的法门来有效认证或校验值。

JavaScriptheader("content-type: application/x-javascript"); echo "var a = 10"; CSSheader("content-type: text/css"); echo "#div id { background:#000; }";

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

那大约上精确. 但有一点点直接的标题. file_put_contents
或者会出于多少个原因退步: >>父目录空中楼阁 >>目录存在, 但不可写
>>文件被写锁住? 所以写文件前做确定的检讨更加好.

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>
function print_header(){ $o = "Site Log and Login links"; return $o;}function print_footer(){ $o = "Site was made by me"; return $o;}echo print_header();for($i = 0 ; $i < 100; $i++){ echo "I is : $i 
';}echo print_footer();

25. 在一切脚本中选择单后生可畏的数据库连接

请确定保障您在任何脚本使用单风华正茂的数据库连接。从风度翩翩最初就开垦连接,使用至甘休,并在终止时关闭它。不要像这么在函数内开垦连接:

function add_to_cart()
{
    $db = new Database();
    $db->query("INSERT INTO cart .....");
}

function empty_cart()
{
    $db = new Database();
    $db->query("DELETE FROM cart .....");
}

有多少个一连也倒霉,会因为种种连接都亟待时间来创立和选择更多的内部存款和储蓄器,而导致实行减缓。

在优秀情况下。举例数据库连接,能够使用单例情势。


原文:http://www.codeceo.com/article/40-php-tips-part-1.html

if $a_count++;

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

像这种类型做可以成功比较多思想政治工作:

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

假如你总是到数据库,无妨设置连接字符集。当您在您的应用程序中应用三种语言时,那相对有必要。

要不会时有产生哪些吧?你会在非拉脱维亚语文本中来看不菲的正方和????????。

11. 毫不在利用中选用gzip压缩输出, 让apache管理 盘算过使用
ob_gzhandler 吗? 不要那么做. 聊无意义. php只利用来编排应用.
不应操心服务器和浏览器的多寡传输优化难题.
使用apache的mod_gzip/mod_deflate 模块压缩内容.

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在左侧栏或在显示器中间的四方中呢?你驾驭干什么会冒出这种意况吗?因为管理进度和输出被混合在了联合。

1)、它首先寻找php包涵路线中的钦命目录,然后查看当前目录。因而,会检查非常多目录。2)、当二个剧本被含有在另一个本子的不等目录中时,它的中央目录变为带有脚本的目录。3)、另八个标题是,当叁个本子从cron运行时,它只怕不会将它的父目录作为职业目录。所以利用相对路线便成为了一个好措施:

15. 并不是检查提交按键值来检查表单提交

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

以上代码在大部时候是不易的,除了应用程序使用多语言的情景。然后 “Save”
能够是不菲不意气风发的东西。那么您该怎么再做相比较?所以不能够依附提交开关的值。相反,使用这些:

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

现今您就足以脱位提交按键的值了。

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

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

为同叁个类公事寻觅四个目录。轻易矫正包蕴类文件的目录,而不破坏其余地点的代码。使用相像的函数用于加载包括帮忙函数、HTML内容等的公文。

23. 使用 set_error_handler()将 Php 错误写入到文件

set_error_handler()能够用来安装自定义的错误管理程序。在文件中编辑一些重大的荒唐用于日志是个好主意。

8. 发送正确的mime类型头消息, 若是输出非html内容的话. 输出一些xml.

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

故此将来,固然你将品种转移到二个例外的目录,举个例子将其活动到一个在线的服务器上,这几个代码不要求改正就足以运作。

从PHP
5.4起,暗中同意编码成了UTF-8,那消除了绝大许多的难点,但您最佳依旧知道那事,假设你的应用程序使用四种语言的话。

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

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

使用 apache mod_gzip/mod_deflate 通过. htaccess 文件收缩内容。

明显性的功利是, 借使php内建有同名的函数, 那样能够幸免冲突.
另生龙活虎种意见是, 你能够在同个利用中为同个类保养八个本子, 而不产生冲突.
那是包装的主导好处, 无它.

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

假如你总是到数据库,不妨设置连接字符集。当您在你的应用程序中使用各类语言时,那相对有必不可缺。

不然会发出怎么着呢?你会在非英语文本中看精湛多的四方和????????。

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

20. 使用 array_map 火速管理数组

举例说,你要 trim 一个数组的具备因素。新手会那样做:

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

但它能够动用 array_map 变得更卫生:

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

那适用于 trim 数组 $arr 的兼具因素。另三个像样的函数是 array_walk。

$arr = array_map;

情景信息是那一个进行义务后转换的音信。

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

四十八个高水平PHP代码的实用手艺,希望大家赏识。

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

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

在写入或保存任何文件早先,请务供给检查该目录是不是是可写的,要是不行写的话,会闪烁错误新闻。那将节省你多量的
“调节和测量试验” 时间。当您办事于 Linux
时,权限是一定要拍卖的,况兼会有那些众多的权位难题时,当目录不可写,文件不只怕读取等的时候。

请保管您的应用程序尽恐怕智能化,并在最短的小时内部报纸告最要害的新闻。

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

file_put_contents($file_path , $contents);

这完全准确。但有一点点直接的标题。file_put_contents
只怕会因为部分缘故而倒闭:

  • 父目录空头支票
  • 目录存在,但不足写
  • 锁定文件用于写入?

故而,在写入文件早前最佳能(CANONState of Qatar够百分百都弄驾驭。

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

经过如此做,你就会获取何地文件写入失利以致为何战败的可信赖音信。

与上述同类, 你将会博得一个 Headers already send error. 为何? 因为 “super
extra character” 已经被输出了. 以往您得起来调节和测量试验啦. 那会花费多量时光寻觅super extra 的岗位。因而, 养成省略关闭符的习贯:

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

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

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

$xml = '';$xml = " 0";//Send xml dataheader("content-type: text/xml");echo $xml;

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

这种用法极其原始. 应该更加灵敏点. 应编写制定个帮手函数包罗文件. 举例:

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

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

看来有别于了吗?很显然。无需其它更加多的解释。

金沙糖果派对网站app,你仍可以够进一层修正:

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

    if(file_exists($path))
    {
        require_once( $path ); 
    }
}

这么做可以做到很多作业:

  • 为同三个类公事搜索多少个目录。
  • 轻易校勘包罗类文件的目录,而不破坏其他地点的代码。
  • 运用相符的函数用于加载包含帮助函数、HTML 内容等的文本。

22. 挟制类型检查

当增加单一条目款项时,使用方面包车型大巴函数。那么当增添八个条约时,就得创建另叁个函数吗?NO。只要让函数变得灵活起来使之能够承担差异的参数就可以。请看:

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

如此越来越好。

if( $_SERVER['REQUEST_METHOD'] == 'POST' and isset { //Save the things }
$host = 'localhost';$username = 'root';$password = 'super_secret';//Attempt to connect to database$c = mysqli_connect($host , $username, $password);//Check connection validityif  { die ("Could not connect to the database host: 
". mysqli_connect_error;}//Set the character set of the connectionif(!mysqli_set_charset { die failed');}

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

据此今后,即便你将品种转移到二个两样的目录,比方将其移动到三个在线的服务器上,那个代码没有必要改动就能够运作。

运用多少个三回九转是个不好的, 它们会拖慢应用,
因为创设连接须要时刻和据有内部存款和储蓄器。特定情景采纳单例情势, 如数据库连接.。

最棒的不二秘诀是使用会话来传播。想要那样做的话在各样页面上必需得有多个session_start。

24. 小心管理大型数组

特大型的数组或字符串,假如三个变量保存了黄金年代部分范围非常的大的事物,那么要小心管理。多如牛毛错误是成立别本,然后耗尽内部存款和储蓄器,并获取内部存款和储蓄器溢出的殊死错误:

$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 文件或导出表到 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
    }
}

尽快还原它们,那样内部存款和储蓄器就会被保释,並且脚本的其他部分就能够放松。

下面是有关怎么样通过援用来赋值进而节省外部存款和储蓄器的多个轻易易行示例。

<?php

ini_set('display_errors' , true);
error_reporting(E_ALL);

$a = array();

for($i = 0; $i < 100000 ; $i++)
{
    $a[$i] = 'A'.$i;
}

echo 'Memory usage in MB : '. memory_get_usage() / 1000000 . '<br />';

$b = $a;
$b[0] = 'B';

echo 'Memory usage in MB after 1st copy : '. memory_get_usage() / 1000000 . '<br />';

$c = $a;
$c[0] = 'B';

echo 'Memory usage in MB after 2st copy : '. memory_get_usage() / 1000000 . '<br />';

$d =& $a;
$d[0] = 'B';

echo 'Memory usage in MB after 3st copy (reference) : '. memory_get_usage() / 1000000 . '<br />';

叁个卓越 php 5.4 机器上的输出是:

Memory usage in MB : 18.08208
Memory usage in MB after 1st copy : 27.930944
Memory usage in MB after 2st copy : 37.779808
Memory usage in MB after 3st copy (reference) : 37.779864

所以得以看看,内部存款和储蓄器被保留在第 3
份通过援引的别本中。不然,在享有普通别本中内部存款和储蓄器将被更加的多地运用。

$a = get_large_array(); pass_to_function;
7.在一个地方收集所有输出,然后一次性输出给浏览器这就是所谓的输出缓冲。比方说,你从不同的函数得到像这样的内容:function print_header(){ echo "Site Log and Login links";}function print_footer(){ echo "Site was made by me";}print_header();for($i = 0 ; $i < 100; $i++){ echo "I is : $i 
';}print_footer();

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

决不通过吃掉语法降低你的代码。而是要让您的逻辑更简明。

  • 运用全数代码高亮功效的文件编辑器。代码高亮有补助收缩不当。

现行反革命, 同个函数能够拍卖差别品种的输入参数了.
能够参见上边的事例重构你的多处代码, 使其更智能.

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

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

那不是很清新?

php5.4以往, 默许编码为UTF-8, 那将缓慢解决广大主题材料. 但万一你的施用是多语言的,
还是要注意编码难题,.

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

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
    在侧边栏或在显示器中间的四方中吗?你知道为啥会并发这种状态吗?因为管理进程和出口被混合在了一同。

本条秘技是还是不是很精粹,相信一定对我们学习php程序设计具备利于。

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

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

PHP 5.4 以前,使用的暗中同意字符编码是 ISO-8859-1,这不能够呈现譬如 À â
那样的字符。

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

从 PHP 5.4 起,暗许编码成了
UTF-8,那解决了超多的主题素材,但你最棒大概清楚这事,借使您的应用程序使用三种语言的话。

那个函数的利用分散到使用四处. 你可能想将她们包裹到有个别类中:

admin

相关文章

发表评论

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