목차
10个对初学者非常有用的PHP技巧,初学者php技巧
您可能感兴趣的文章:
php教程 php手册 10个对初学者非常有用的PHP技巧,初学者php技巧

10个对初学者非常有用的PHP技巧,初学者php技巧

Jun 13, 2016 am 08:41 AM
php 기능

10个对初学者非常有用的PHP技巧,初学者php技巧

本文介绍一些关于改善和优化PHP代码的提示和技巧,供大家参考,具体内容如下

1.不要使用相对路径,要定义一个根路径

这样的代码行很常见:

require_once('../../lib/some_class.php');
로그인 후 복사

这种方法有很多缺点:

1)、它首先搜索php包括路径中的指定目录,然后查看当前目录。因此,会检查许多目录。
2)、当一个脚本被包含在另一个脚本的不同目录中时,它的基本目录变为包含脚本的目录。
3)、另一个问题是,当一个脚本从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

로그인 후 복사

所以现在,即使你将项目转移到一个不同的目录,例如将其移动到一个在线的服务器上,这些代码不需要更改就可以运行。

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

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

로그인 후 복사

4.通过会话传播状态消息

状态消息是那些执行任务后生成的消息。

<&#63;php
if($wrong_username || $wrong_password)
{
  $msg = 'Invalid username or password';
}
&#63;>
<html>
<body>

<&#63;php echo $msg; &#63;>

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

로그인 후 복사

在你的脚本中:

<&#63;php
if($wrong_username || $wrong_password)
{
  set_flash('Invalid username or password');
}
&#63;>
<html>
<body>

Status is : <&#63;php echo get_flash(); &#63;>
<form>
...
</form>
</body>
</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) );

로그인 후 복사

好了,现在同样的函数就可以接受不同类型的输出了。以上代码可以应用到很多地方让你的代码更加灵活。

6.省略结束的php标签,如果它是脚本中的最后一行

我不知道为什么很多博客文章在谈论php小技巧时要省略这个技巧。

<&#63;php

echo "Hello";

//Now dont close this tag

로그인 후 복사

这可以帮助你省略大量问题。举一个例子:

类文件super_class.php

<&#63;php
class super_class
{
  function super_function()
  {
    //super code
  }
}
&#63;>
//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。为什么呢?因为“超级多余字符”,所有标题都去处理这个去了。于是你得开始调试。你可能需要浪费很多时间来寻找超级额外的空间。

因此要养成省略结束标签的习惯:

<&#63;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在侧边栏或在屏幕中间的方框中吗?你知道为什么会出现这种情况吗?因为处理过程和输出被混合在了一起。
8.当输出非HTML内容时,通过header发送正确的mime类型

请看一些XML。

$xml = '<&#63;xml version="1.0" encoding="utf-8" standalone="yes"&#63;>';
$xml = "<response>
 <code>0</code>
</response>";

//Send xml data
echo $xml;

로그인 후 복사

工作正常。但它需要一些改进。

$xml = '<&#63;xml version="1.0" encoding="utf-8" standalone="yes"&#63;>';
$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');
}

로그인 후 복사

一旦你连接到数据库,不妨设置连接字符集。当你在你的应用程序中使用多种语言时,这绝对有必要。

否则会发生什么呢?你会在非英文文本中看到很多的方框和????????。

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

PHP 5.4之前,使用的默认字符编码是ISO-8859-1,这不能显示例如À â 这样的字符。

$value = htmlentities($this->value , ENT_QUOTES , 'UTF-8');
로그인 후 복사

从PHP 5.4起,默认编码成了UTF-8,这解决了大部分的问题,但你最好还是知道这件事,如果你的应用程序使用多种语言的话。

先介绍这10个技巧,剩下的PHP技巧我们将在接下来的文章中为大家分享,感谢您的阅读。

您可能感兴趣的文章:

  • PHP 定界符 使用技巧
  • PHP include_path设置技巧分享
  • PHP数组操作汇总 php数组的使用技巧
  • PHP递归调用的小技巧讲解
  • php实现多张图片上传加水印技巧
  • php一些错误处理的方法与技巧总结
  • PHP时间戳 strtotime()使用方法和技巧
  • 关于JSON以及JSON在PHP中的应用技巧
  • PHP小技巧之JS和CSS优化工具Minify的使用方法
  • PHP命名空间(namespace)的动态访问及使用技巧
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

CakePHP 프로젝트 구성 CakePHP 프로젝트 구성 Sep 10, 2024 pm 05:25 PM

이번 장에서는 CakePHP의 환경 변수, 일반 구성, 데이터베이스 구성, 이메일 구성에 대해 알아봅니다.

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP 날짜 및 시간 CakePHP 날짜 및 시간 Sep 10, 2024 pm 05:27 PM

cakephp4에서 날짜와 시간을 다루기 위해 사용 가능한 FrozenTime 클래스를 활용하겠습니다.

CakePHP 데이터베이스 작업 CakePHP 데이터베이스 작업 Sep 10, 2024 pm 05:25 PM

CakePHP에서 데이터베이스 작업은 매우 쉽습니다. 이번 장에서는 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 이해하겠습니다.

CakePHP 파일 업로드 CakePHP 파일 업로드 Sep 10, 2024 pm 05:27 PM

파일 업로드 작업을 위해 양식 도우미를 사용할 것입니다. 다음은 파일 업로드의 예입니다.

CakePHP 라우팅 CakePHP 라우팅 Sep 10, 2024 pm 05:25 PM

이번 장에서는 라우팅과 관련된 다음과 같은 주제를 학습하겠습니다.

CakePHP 토론 CakePHP 토론 Sep 10, 2024 pm 05:28 PM

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

CakePHP 유효성 검사기 만들기 CakePHP 유효성 검사기 만들기 Sep 10, 2024 pm 05:26 PM

컨트롤러에 다음 두 줄을 추가하면 유효성 검사기를 만들 수 있습니다.

See all articles