个对初读书人非常平价的PHP技巧,特别有效的lom599乐百家手机:

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

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

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

进而现在,纵然你将项目转移到二个不等的目录,比如将其移动到二个在线的服务器上,这一个代码没有要求更动就足以运作。

接上大器晚成篇:百家了乐八大技巧 ,40+个对初读书人特别实惠的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 内容等的文本。

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

思忖选用ob_gzhandler?不,别这么做。它并未有此外意义。PHP应该是来写应用程序的。不要顾虑PHP中有关怎样优化在服务器和浏览器之间传输的数目。

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

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

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_lom599乐百家手机 ,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"]

那不是很清新?

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>

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

通过如此做,你就会得到哪儿文件写入失败甚至为何失利的准确消息。

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

好了,现在一样的函数就能够接收区别连串的输出了。以上代码能够接纳到众多地点令你的代码越来越灵活。

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

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

如此那般越来越好。

15.绝不检查提交开关值来检查表单提交

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

如上代码在大许多时候是科学的,除了应用程序使用多语言的场地。然后“Save”可以是好些个不及的事物。那么您该怎么样再做相比较?所以不能依据提交开关的值。相反,使用那一个:

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

现在你就足以抽身提交按键的值了。

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 在左边栏或在显示器中间的四方中吗?你领会为啥会合世这种情形吗?因为管理进程和出口被混合在了同步。

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

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

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

万生机勃勃您总是到数据库,无妨设置连接字符集。当你在您的应用程序中央银行使多样语言时,那纯属有供给。

要不会产生哪些吧?你会在非Slovak语文本中来看不少的正方和????????。

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有类同名称的放松权利函数,那么名称不会产生冲突。

从另三个角度看,你能够在同生龙活虎的应用程序中有限协助多个版本的相似类,而不会产生任何冲突。因为它棉被服装进了,就是那样。

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

PHP 5.4 在此以前,使用的私下认可字符编码是 ISO-8859-1,那不能够显得比方 À â 这样的字符。

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

从 PHP 5.4 起,暗许编码成了 UTF-8,那杀绝了绝大超多的难点,但您最佳依旧清楚那件事,借令你的应用程序使用二种语言的话。

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

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

  • 选择具备代码高亮功用的文本编辑器。代码高亮有扶持减少不当。

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

思忖选拔 ob_gzhandler?不,别那样做。它从不别的意义。PHP 应该是来写应用程序的。不要忧郁 PHP 中关于怎样优化在服务器和浏览器之间传输的数量。

使用 apache mod_gzip/mod_deflate 通过. htaccess 文件降低内容。

20. 使用array_map神速管理数组

譬如说,你要trim多少个数组的享有因素。新手会那样做:

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

但它还不错array_map变得更整洁:

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

那适用于trim数组$arr的兼具因素。另二个左近的函数是array_walk。

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

那不是很清爽?

21.行使php过滤器验证数据

你是还是不是运用正则表达式来注解如电子邮件,IP地址等值?是的,每一种人都以如此做的。今后,让大家查究一个差异的东西,那就是过滤器。

php过滤器扩张程序将提供轻便的艺术来有效申明或校验值。

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

在写入或保存任何公文早先,请务须求检查该目录是还是不是是可写的,假如不行写的话,会闪烁错误新闻。那将节约你多量的 “调节和测量试验” 时间。当你办事于 Linux 时,权限是必供给管理的,何况会有好些个广大的权能难点时,当目录不可写,文件没办法读取等的时候。

请保管您的应用程序尽或然智能化,并在最短的大运内部报纸告最要紧的消息。

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

file_put_contents($file_path , $contents);

那完全准确。但有点直接的标题。file_put_contents 恐怕会因为部分缘故而停业:

  • 父目录空中楼阁
  • 目录存在,但不足写
  • 锁定文件用于写入?

由此,在写入文件以前最佳可以百分百都弄精晓。

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

经过如此做,你就能够获取哪儿文件写入退步以致为啥退步的可相信音讯。

上一篇:如何正确配置 下一篇:没有了