PHP 코드 품질을 향상시키는 방법

小云云
풀어 주다: 2023-03-20 22:22:01
원래의
1759명이 탐색했습니다.

PHP 프로그래머로서 나는 내 PHP 코드의 품질이 매우 높기를 바랍니다. 이 기사는 모든 사람에게 도움이 되기를 바라면서 주로 PHP 코드의 품질을 향상시키는 방법을 공유합니다.

1. 상대 경로를 사용하지 마세요

자주 보이는 방법:

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

이 방법에는 많은 단점이 있습니다.

먼저 지정된 PHP 포함 경로를 찾은 다음 현재 디렉터리를 찾습니다.

따라서 경로 확인이 너무 많을 것입니다.

스크립트가 다른 디렉터리의 스크립트에 포함된 경우 해당 기본 디렉터리는 다른 스크립트가 있는 디렉터리가 됩니다.

또 다른 문제는 예약된 작업이 스크립트를 실행할 때 해당 상위 디렉터리입니다. 디렉토리는 작업 디렉토리가 아닐 수도 있습니다.

따라서 가장 좋은 선택은 절대 경로를 사용하는 것입니다.

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, include, include_once, require_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. 애플리케이션에 대한 디버깅 코드 유지

개발 환경에서는 데이터베이스 쿼리를 인쇄하고 문제가 있는 변수 값을 덤프하며 문제가 해결되면 하지만 더 나은 방법은 코드를 계속 디버깅하는 것입니다.

개발 환경에서는 다음을 수행할 수 있습니다.

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.

system, exec, passthru, shell_exec 이 네 가지 기능은 시스템 명령을 실행하는 데 사용할 수 있습니다. 문제는 공유 호스팅에서는 대부분의 초보자가 선택적으로 비활성화할 수 있다는 것입니다. 사용하기 전에 어떤 기능을 사용할 수 있는지 매번 확인하세요.

더 나은 해결책은 해당 기능을 크로스 플랫폼 기능으로 캡슐화하는 것입니다.

/**
	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');
로그인 후 복사

위 함수는 사용 가능한 시스템 기능이 있는 한 쉘 명령을 실행합니다.

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에 대한 제안이 그렇게 많은지 알고 싶습니다. 블로그 게시물 중 이 내용이 언급되지 않았습니다.

<?phpecho "Hello";//Now dont close this tag
로그인 후 복사

이렇게 하면 시간이 많이 절약됩니다. 예를 들어보세요:

super_class.php 파일

<?phpclass super_class{    function super_function()
    {        //super code
    }
}?>//super extra character after the closing tag
로그인 후 복사

index.php

require_once(&#39;super_class.php&#39;);//echo an image or pdf , or set the cookies or session data
로그인 후 복사

이렇게 하면 "슈퍼 추가 문자"가 출력되었기 때문에 오류가 발생합니다. 디버깅. 슈퍼 엑스트라의 위치를 ​​찾는 데 시간이 많이 걸립니다.

그러므로 닫는 문자를 생략하는 습관을 들이세요:

<?phpclass super_class{    function super_function()
    {        //super code
    }
}//No closing tag
로그인 후 복사

이것이 더 좋습니다.

7. 모든 입력을 어딘가에 수집하고 한 번에 브라우저에 출력합니다.

이것을 출력 버퍼링이라고 합니다. 다른 기능에 출력 콘텐츠가 있는 경우:

function print_header(){    echo "<p id=&#39;header&#39;>Site Log and Login links</p>";
}function print_footer(){    echo "<p id=&#39;footer&#39;>Site was made by me</p>";
}

print_header();for($i = 0 ; $i < 100; $i++)
{    echo "I is : $i <br />&#39;;
}
print_footer();
로그인 후 복사

또는 출력을 어딘가에 중앙에서 수집할 수도 있습니다. 함수의 경우 ob_start 및 ob_end_clean을 사용할 수도 있습니다. 다음과 같이:

function print_header(){
    $o = "<p id=&#39;header&#39;>Site Log and Login links</p>";    return $o;
}function print_footer(){
    $o = "<p id=&#39;footer&#39;>Site was made by me</p>";    return $o;
}echo print_header();for($i = 0 ; $i < 100; $i++)
{    echo "I is : $i <br />&#39;;
}
echo print_footer();
로그인 후 복사

출력 버퍼링이 필요한 이유:

>>str_replaces 함수나 preg_replaces 또는 add와 같이 출력을 변경할 수 있습니다. 일부 HTML 콘텐츠를 모니터링/디버깅합니다.

>> 브라우저에 출력하면서 동시에 PHP로 처리하는 것은 사이드바나 일부 사이트 중간에 나타나는 오류 메시지를 본 적이 있을 것입니다. 처리와 출력이 혼합되어 있기 때문입니다.

8. HTML이 아닌 콘텐츠를 출력하는 경우 올바른 MIME 유형 헤더 정보를 보냅니다.

일부 xml을 출력합니다.

$xml = &#39;<?xml version="1.0" encoding="utf-8" standalone="yes"?>&#39;;
$xml = "<response>
  <code>0</code>
</response>";//Send xml dataecho $xml;
로그인 후 복사

잘 작동합니다.

$xml = &#39;<?xml version="1.0" encoding="utf-8" standalone="yes"?>&#39;;
$xml = "<response>
  <code>0</code>
</response>";//Send xml dataheader("content-type: text/xml");echo $xml;
로그인 후 복사

헤더 라인에 주의하세요. 이 라인은 전송된 내용이 xml 유형 콘텐츠임을 브라우저에 알려줍니다. 따라서 브라우저는 이를 올바르게 처리할 수 있습니다. 많은 자바스크립트 라이브러리도 헤더 정보에 의존합니다.

유사한 라이브러리에는 javascript, css, jpg 이미지가 포함됩니다. , png 이미지:

JavaScript

header("content-type: application/x-javascript");
echo "var a = 10";
로그인 후 복사

CSS

header("content-type: text/css");echo "#p id { background:#000; }";
로그인 후 복사

한 번은 mysql 테이블에 유니코드/utf-8 인코딩이 설정되어 있고 phpadmin이 이를 올바르게 표시할 수 있었지만 콘텐츠를 가져와서 페이지에 출력하는 경우를 발견했습니다. , 잘못된 문자가 나타납니다. 여기서 문제는 mysql 연결의 문자 인코딩입니다.

//Attempt to connect to database$c = mysqli_connect($this->host , $this->username, $this->password);//Check connection validityif (!$c) 
{	die ("Could not connect to the database host: <br />". mysqli_connect_error());
}//Set the character set of the connectionif(!mysqli_set_charset ( $c , &#39;UTF8&#39; ))
{	die(&#39;mysqli_set_charset() failed&#39;);
}
로그인 후 복사

일단 데이터베이스에 연결되면 연결의 문자 집합을 설정하는 것이 가장 좋습니다. 이는 응용 프로그램이 여러 언어를 지원하는 경우 필요합니다.

10. htmlentities를 사용하여 올바른 인코딩 옵션을 설정하세요

php5 .4 이전에는 문자의 기본 인코딩이 ISO-8859-1이어서 À â 등 직접 출력할 수 없었습니다.

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

php5.4以后, 默认编码为UTF-8, 这將解决很多问题. 但如果你的应用是多语言的, 仍然要留意编码问题,.

위 내용은 PHP 코드 품질을 향상시키는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿