首页vns威尼斯城官网登入 › 如果该脚本被另一目录的脚本包含vns威尼斯城官网登入,付费投稿计划

如果该脚本被另一目录的脚本包含vns威尼斯城官网登入,付费投稿计划

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

本文介绍部分关于改过和优化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

故此未来,即便你将项目转移到叁个两样的目录,比如将其运动到二个在线的服务器上,那一个代码不需求改培育足以运作。

48个高素质PHP代码的实用技术,希望大家心爱。

前日大家要介绍部分有关修正和优化PHP代码的唤醒和技能。请在意,这几个PHP手艺适用于初学者,并非那多个曾在选用MVC框架的人。

1.永不采取相对路径,要定义多少个根路线

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

1.不要接收相对路径 频频会看出:

vns威尼斯城官网登入 1

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

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";
    }    
}
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运维时,它恐怕不会将它的父目录作为专门的职业目录。所以采纳绝对路线便成为了二个好点子:

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>

该格局有广大胜笔: 它首先查找内定的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内容等的文件。
define('ROOT' , '/var/www/project/');require_once(ROOT . '../../lib/some_class.php');//rest of the code

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.在应用程序中维护调节和测量检验意况

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

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

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能够变,那么大家每一趟都要改呢?

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

那样越来越好。

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

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__能够让它变得可移植。请紧凑看:

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
    在右侧栏或在显示器中间的四方中吗?你领悟干什么会身不由己这种地方吧?因为管理进度和输出被混合在了一只。

咱俩定义了三个相对路线, 值被写死了. 大家仍是可以改良它. 路线/var/www/project 也大概会变动, 那么大家每一遍都要改成它吧? 不是的,
我们能够选取__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

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

与此相类似越来越好。

据此现在,纵然你将品种转移到三个不等的目录,举个例子将其移动到一个在线的服务器上,那么些代码无需更改就能够运维。

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

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

要不会发出怎么样吗?你会在违法语文本中来看众多的正方和????????。

不久前, 无论你移到哪些目录, 如移到多少个外网的服务器上,
代码无须改动便可科学生运动转.

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

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

PHP 5.4 早前,使用的暗许字符编码是 ISO-8859-1,那不能展现比如 À â
那样的字符。

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

从 PHP 5.4 起,默许编码成了
UTF-8,这消除了绝大超级多的难点,但你最佳或然清楚那件事,要是您的应用程序使用各种语言的话。

2. 永不直接行使 require, include, include_once, required_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; }"

您的本子上恐怕会席卷各类文件,如类库,实用程序文件和帮忙函数等,就好像这么些:

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

假造动用 ob_gzhandler?不,别那样做。它从未其余意义。PHP
应该是来写应用程序的。不要忧郁 PHP
中有关如何优化在服务器和浏览器之间传输的数额。

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

require_once('lib/Database.php');
 require_once('lib/Mail.php');
 require_once('helpers/utitlity_functions.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');
}

如果您总是到数据库,不要紧设置连接字符集。当你在您的应用程序中采取四种语言时,那纯属有须求。

再不会产生什么样啊?你会在非罗马尼亚语文本中旁观多数的正方和????????。

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

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

那不是很清新?

这种用法优秀原始. 应该越来越灵活点. 应编写制定个帮手函数包罗文件. 举例:

10.用到含有准确字符集选项的htmlentities

PHP 5.4事情未发生前,使用的私下认可字符编码是ISO-8859-1,那不能够显得比如À â
那样的字符。

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

从PHP
5.4起,暗中同意编码成了UTF-8,那消逝了绝大大多的难点,但您最佳照旧明白那事,纵然你的应用程序使用八种语言的话。

先介绍那11个技艺,剩下的PHP技艺大家将要接下去的小说中为大家享受,谢谢您的开卷。

这一定粗糙。代码要求更为灵活。写好支持函数能够更便于地包罗东西。比如:

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

在写入或保存任何文件以前,请务需要检查该目录是还是不是是可写的,假如不行写的话,会闪烁错误音信。那将节省你大量的
“调节和测验” 时间。当您办事于 Linux
时,权限是必定要拍卖的,并且会有不菲广大的权杖难题时,当目录不可写,文件无法读取等的时候。

请确认保障您的应用程序尽也许智能化,并在最短的年华内部报纸告最主要的音讯。

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

file_put_contents($file_path , $contents);

那完全准确。但有一点点直接的主题素材。file_put_contents
恐怕会因为有的原由此未果:

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

就此,在写入文件从前最佳能(CANON卡塔尔(قطر‎够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");
}

因此如此做,你就能够赢得哪里文件写入战败以至为啥退步的精确新闻。

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{ //path to the class file $path = ROOT . '/lib/' . $class_name . '.php'); require_once; }load_class;load_class;

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

有怎么着极小器晚成致啊? 该代码更具可读性。將来你可以按需扩充该函数, 如:

看看有别于了呢?很明显。没有供给其余越来越多的分解。

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

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

如上代码在大多数时候是科学的,除了应用程序使用多语言的状态。然后 “Save”
能够是广大两样的事物。那么你该怎么再做相比较?所以不能够借助提交开关的值。相反,使用这几个:

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

最近您就能够蝉蜕提交按键的值了。

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

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

还可做得越多: 为同样文件查找五个目录。能十分轻易的更正放置类公事的目录,
无须在代码到处生机勃勃大器晚成改进。可利用相通的函数加载文件, 如html内容.

那样做可以成功很多作业:

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

3. 为运用保留调节和测量试验代码 在支付景况中, 大家打字与印刷数据库查询语句, 转存临时常的变量值,
而风流倜傥旦难题化解, 大家解说或删除它们.
不过越来越好的做法是保留调节和测验代码。在支付景况中, 你能够:

为同一个类公事找寻多少个目录。轻松修改包蕴类文件的目录,而不损坏别的地点的代码。使用相近的函数用于加载包蕴扶助函数、HTML内容等的文件。

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

从另多少个角度看,你能够在平等的应用程序中维系八个本子的雷同类,而不会产生任何冲突。因为它被包裹了,就是那样。

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

3.在应用程序中珍爱调节和测验蒙受

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

不用通过吃掉语法裁减你的代码。而是要令你的逻辑更简短。

  • 利用拥有代码高亮作用的文本编辑器。代码高亮有利于裁减不当。

在服务器中, 你能够:

在支付进程中,我们echo数据库查询,转储成立难点的变量,然后假使难题被解决,大家批注它们或删除它们。但让任何留在原地可提供长效帮扶。

20. 使用 array_map 急忙管理数组

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

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

但它能够应用 array_map 变得更洁净:

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

那适用于 trim 数组 $arr 的全体因素。另一个看似的函数是 array_walk。

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

在开垦Computer上,你能够那样做:

21. 利用 php 过滤器验证数据

您是还是不是应用正则表明式来表达如电子邮件,IP
地址等值?是的,各样人都以这么做的。今后,让我们试试叁个不及的东西,那便是过滤器。

php 过滤器扩张程序将提供简单的不二等秘书诀来有效认证或校验值。

4. 接受可跨平台的函数实践命令
system, exec, passthru, shell_exec 那4个函数可用于试行系统命令.
每一个的一坐一起都有一线差异. 难点在于, 当在分享主机中,
有些函数也许被接受性的禁止使用. 大超多生手趋于每一回首先检查哪个函数可用,
不过再利用它。越来越好的方案是封成函数三个可跨平台的函数.

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

22. 威吓类型检查

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

那是后生可畏种好习贯。

/**
 Method to execute a command in the terminal
 Uses :
 1. system
 2. passthru
 3. exec
 4. shell_exec
 */
 function terminal($command)
 {
 //system
 if(function_exists('system'))
 {
 ob_start();
 system($command , $return_var);
 $output = ob_get_contents();
 ob_end_clean();
 }
 //passthru
 else if(function_exists('passthru'))
 {
 ob_start();
 passthru($command , $return_var);
 $output = ob_get_contents();
 ob_end_clean();
 }
 //exec
 else if(function_exists('exec'))
 {
 exec($command , $output , $return_var);
 $output = implode("\n" , $output);
 }
 //shell_exec
 else if(function_exists('shell_exec'))
 {
 $output = shell_exec($command) ;
 }
 else
 {
 $output = 'Command execution not possible on this system';
 $return_var = 1;
 }
return array('output' => $output , 'status' => $return_var);
 }
 terminal('ls');

与此同期在服务器上,你能够如此做:

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

set_error_handler()能够用来设置自定义的错误管理程序。在文书中编辑一些主要的不当用于日志是个好主意。

上面包车型客车函数將运维shell命令, 只要有三个种类函数可用, 那保持了代码的等同种性别.

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

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
份通过援引的别本中。不然,在具备普通别本中内存将被进一层多地利用。

5. 灵活编写函数

4.透过会话传播意况音信

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

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

场合新闻是那几个举办义务后调换的消息。

利用方面包车型客车函数增加单个项目. 而当增加项列表的时候,你要开创另三个函数吗?
不用, 只要稍加注意差别种类的参数, 就能够更加灵活. 如:

诸有此类的代码很广泛。使用变量来展现状态音信有早晚的局限性。因为它们不或者通过重定向发送(除非您将它们作为GET变量传播给下一个本子,但这十二分鲁钝)。何况在巨型脚本中大概会有多少个消息等。

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

最棒的不二等秘书诀是应用会话来传播。想要那样做的话在每种页面上必需得有一个session_start。

今天, 同个函数能够管理分化等级次序的输入参数了.
能够参考上边的例证重构你的多处代码, 使其更智能.

转载本站文章请注明出处:vns威尼斯城官网登入 http://www.tiec-ccpittj.com/?p=4616

上一篇:

下一篇:

相关文章