>  기사  >  백엔드 개발  >  초보자를 위한 10가지 매우 유용한 PHP 팁_php 팁

초보자를 위한 10가지 매우 유용한 PHP 팁_php 팁

WBOY
WBOY원래의
2016-05-16 19:54:431094검색

이 글에서는 참고용으로 PHP 코드 개선 및 최적화에 대한 몇 가지 팁과 요령을 소개합니다.

1. 상대 경로를 사용하지 말고 루트 경로를 정의하세요

다음과 같은 대사가 일반적입니다.

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

이 접근 방식에는 많은 단점이 있습니다.

1) 먼저 php include 경로에 지정된 디렉터리를 검색한 후, 현재 디렉터리를 확인합니다. 따라서 많은 디렉터리가 검사됩니다.
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_once 또는 include_once를 포함하여 require를 사용하지 마세요

스크립트에는 클래스 라이브러리, 유틸리티 파일, 도우미 함수 등 다양한 파일이 포함될 수 있습니다.

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. 애플리케이션 내 디버깅 환경 유지

개발 중에는 데이터베이스 쿼리를 에코하고 문제를 일으킨 변수를 덤프한 다음 문제가 해결되면 주석 처리하거나 삭제합니다. 그러나 모든 것을 제자리에 놔두면 장기적인 도움이 될 수 있습니다.

개발 컴퓨터에서는 다음을 수행할 수 있습니다.

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

단일 항목을 추가할 때 위 기능을 사용하세요. 그러면 여러 항목을 추가할 때 다른 기능을 만들어야 합니까? 아니요. 다양한 매개변수를 수용할 수 있도록 함수를 유연하게 만드세요. 참조하세요:

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

잘못된 헤더가 전송됩니다. 왜? "매우 중복되는 문자"로 인해 모든 타이틀이 이 문제를 처리해야 합니다. 따라서 디버깅을 시작해야 합니다. 슈퍼 추가 공간을 찾는 데 많은 시간을 낭비해야 할 수도 있습니다.

따라서 닫는 태그를 생략하는 습관을 들이세요.

<&#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技巧我们将在接下来的文章中为大家分享,感谢您的阅读。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.