PHP의 숨겨진 기능? [닫은]


174

나는 이것이 요점을 묻는 질문처럼 들리지만 내가 어디에서 왔는지 설명해 줄 것입니다.

대학 밖에서 PHP 상점에 취직했습니다. 나는 1 년 반 동안 일했고 프로그래밍에 관해 배울 수있는 모든 것을 배웠다고 생각했습니다.

그런 다음 모든 작업이 C #으로 이루어진 규모가 큰 회사에서 한 사람의 내부 개발 상점으로 일했습니다. 그 입장에 대한 저의 헌신으로 저는 수많은 블로그와 책을 읽기 시작했고 모든 것을 알고 있다고 생각하는 것이 얼마나 잘못되었는지 빨리 깨달았습니다. 나는 단위 테스트, 의존성 주입 및 데코레이터 패턴, 느슨한 결합의 디자인 원리, 상속 토론에 대한 구성 등에 대해 배웠습니다. 여전히 많이 흡수하고 있습니다. 내 프로그래밍 스타일이 작년에 완전히 바뀌 었다는 것은 말할 필요도 없습니다.

이제 친구의 시작을 위해 코딩을하는 PHP 프로젝트를 선택하고 C #의 프로그래밍과는 달리 완전히 제약을 느낍니다. 클래스 범위의 모든 변수는 '$ this->'을 추가하여 참조해야한다는 사실을 정말로 귀찮게합니다. 내가 시도한 IDE 중 어느 것도 매우 지능적이지 않으며 SimpleTest 단위 테스트 방법은 단어 'test'로 시작해야한다는 것을 짜증나게합니다. 동적 타이핑으로 메소드가 기대하는 매개 변수 유형을 암시 적으로 지정하지 못하게하고 메소드 오버로드를 수행하기 위해 switch 문을 작성해야한다는 사실에 미치게됩니다. 중첩 된 네임 스페이스를 가질 수 없으며 :: 연산자를 사용하여 기본 클래스의 생성자를 호출해야한다는 것을 참을 수 없습니다.

이제 PHP vs C # 토론을 시작할 의도가 없습니다. 오히려 내가 말하려는 것은 모르거나 알지 못하지만 아직 제대로 사용하지 못하는 PHP 기능이 있다는 것입니다. C # 유니버스에 설정되어 있고 유리 그릇 외부를 보는 데 문제가 있습니다.

PHP에서 가장 좋아하는 기능은 무엇입니까? .Net 언어로 할 수 없거나 어렵게 할 수있는 일은 무엇입니까?


깨진 OO 패러다임? 나를 위해 그것은 당신이 발견하는 최악의 "숨겨진"기능입니다.
knoopx

이 스레드는 재밌습니다 ... "숨겨진 기능"으로 작업하는 팀이기 때문에 "버그"를 의미하는 코드 구문입니다. 그리고 당신은 알고 있습니다 ... 때로는 숨겨진 기능을 발견하는 것이 반드시 좋은 것은 아닙니다 ...
Ganesh Shankar

@Ganesh 한 사람의 버그는 또 다른 사람의 숨겨진 기능입니다 ...
Xeoncross

답변:


328

문서 . 문서 내 투표를 가져옵니다. 프로그래밍 언어에 대한보다 철저한 온라인 문서를 만나지 못했습니다. 다른 모든 웹 사이트와 매뉴얼 페이지에서 함께 만들어야합니다.


60
나는 동의한다. www.php.net/function_name을 입력하고 대부분의 시간 동안 참조를 얻는 것이 좋습니다.
Allain Lalonde

1
이것은 PHP의 훌륭한 기능이지만 실제로는 숨겨 두지 않을 것입니다 ... 메소드 매개 변수 등을 검색 한 경우 php.net으로 끝납니다.
John Bubriski

27
동의합니다. 매뉴얼에서 가장 큰 것은 사용자 의견입니다. 나는 다른 문서들에 그것들이있는 것을 거의 보지 못했다. 그들은 진짜 보석을 포함 할 수 있습니다. 유일한 단점은 IMHO가 너무 빨리 가지 치기를한다는 것입니다.
Sander Marechal 2016 년

3
@Phoexo "약간 읽을 수없는"?? PHP 문서는 쉽고 명확하지만 MSDN을 이해하지 못하고 이해하지 못합니다.
lauriys

3
동의하지 않는다. 문서가 "좋은"유일한 이유는 일부 사용자 의견이 공식 메모의 모든 구멍을 막고 있기 때문입니다.
Rob Howard

179

배열 . 이 질문에 대한 답변에서 판단하면 사람들이 PHP의 배열이 얼마나 쉽고 유용한 지 완전히 이해하지 못한다고 생각합니다. PHP 배열은 동시에 목록, 맵, 스택 및 일반 데이터 구조의 역할을합니다. 배열은 언어 코어로 구현되며 모든 곳에서 사용되어 CPU 캐시 위치가 양호합니다. Perl과 Python은 목록과 맵에 별도의 언어 구성을 사용하여 더 많은 복사와 혼동되는 변환을 만듭니다.


11
PHP 배열 요소가 주문됩니다.
user8134

117
PHP에서 C #으로의 초기 이동으로 거의 죽었습니다. C #에서 배열은 정적 크기와 숫자 인덱스를 가진 단순한 구조입니다. PHP에서 배열은 우주의 덕트 테이프입니다!
Dinah

4
동의합니다. Uni 과제를 위해 Java를 사용할 때 유연성이 전혀없는 강성에 놀랐습니다. PHP 배열이 얼마나 좋은지 정말 감사하게 생각했습니다.
Christian

11
PHP 배열은 훌륭하지만 C # 배열을 두드리는 주석에 대해 40 표를 얻었습니까? C # 배열이 필요에 맞지 않으면 많은 옵션이 있습니다. ArrayList 및 일반 컬렉션은 모두 매우 강력합니다. 특정 요구에 맞는 다양한 유형의 컬렉션이 있습니다. 이와 관련하여 PHP의 실제 장점 은 프로그래머가 결정해야 할 옵션을 제공하지 않는다는 것입니다. 배열을 사용하거나 색인 가능한 변수가 없습니다.
G-Wiz

24
반면, 배열 구문은 완전히 빨라집니다. 많은 스크립팅 언어에서 다음과 같이 간단한 2D 배열을 만들 수 있습니다 . [[1, 2], [3, 4]]PHP 버전과 비교하십시오 array(array(1, 2), array(3, 4)).
르네 자르 수

167

스트림 핸들러를 사용하면 내가 알고있는 한 대부분의 다른 언어에서는 수행하기 어려운 논리를 사용하여 "FileSystem"을 확장 할 수 있습니다.

예를 들어 MS-Excel 스트림 처리기 를 사용하면 다음과 같은 방법으로 MS Excel 파일을 만들 수 있습니다.

$fp = fopen("xlsfile://tmp/test.xls", "wb");
if (!is_resource($fp)) { 
    die("Cannot open excel file");
}

$data= array(
    array("Name" => "Bob Loblaw", "Age" => 50),  
    array("Name" => "Popo Jijo", "Age" => 75),  
    array("Name" => "Tiny Tim", "Age" => 90)
); 

fwrite($fp, serialize($data));
fclose($fp);

KIO 프레임 워크를 사용하면이 작업을 수행 할 수 있지만 KDE 기반 데스크톱 응용 프로그램에서만 사용할 수 있습니다.
MiffTheFox 2016

21
적절한 OO 접근 방식을 가진 IMHO는 스트림 처리기가있는이 혼란보다 훨씬 더 합리적입니다. 예, Excel 파일을 읽고 쓸 수있는 것이 귀엽지 만 이런 식으로 작동해야합니까?
Anti Veeranna

3
어쩌면이 방법은 대부분의 PHP 개발자에게 공통적 인 인터페이스의 복잡성을 캡슐화 할 수 있습니다. 객체 지향 개념을 배우지 않아도됩니다.
Allain Lalonde

13
Amazon S3를 사용하는 경우 's3 : // {bucket-name} / path'와 같은 URL에 대한 스트림 인터페이스를 제공하는 Zend_Amazon_S3를 확인하십시오.
davidtbernal

필자는 PHP 파일을 읽고 문자열 대체를 수행하고 eval ()을 전달하여 뷰 레이어에 대한 간단한 DSL을 만드는 데 사용했습니다. 예를 들어, 내가 선택할 때마다 짧은 태그를 사용하고 @-> someVar를 수행 할 수 있도록 뷰 수준 데이터에 액세스 할 수 있도록 만들었습니다.
Jasper Bekkers 2009

131

매직 메소드 는 존재하지 않는 메소드를 호출하거나 존재하지 않는 특성을 지정하거나 읽을 때마다 호출되는 대체 메소드입니다.

interface AllMagicMethods {
    // accessing undefined or invisible (e.g. private) properties
    public function __get($fieldName);
    public function __set($fieldName, $value);
    public function __isset($fieldName);
    public function __unset($fieldName);

    // calling undefined or invisible (e.g. private) methods
    public function __call($funcName, $args);
    public static function __callStatic($funcName, $args); // as of PHP 5.3

    // on serialize() / unserialize()
    public function __sleep();
    public function __wakeup();

    // conversion to string (e.g. with (string) $obj, echo $obj, strlen($obj), ...)
    public function __toString();

    // calling the object like a function (e.g. $obj($arg, $arg2))
    public function __invoke($arguments, $...);

    // called on var_export()
    public static function __set_state($array);
}

여기서 C ++ 개발자는 PHP가 일부 연산자 (예 : ()또는)를 오버로드 할 수 있음을 알 수 있습니다 (string). 실제로 PHP는 []연산자 ( ArrayAccess ), foreach언어 구성 ( IteratorIteratorAggregate ) 및 count함수 ( Countable ) 와 같은 훨씬 더 많은 과부하를 허용 합니다.


4
매직 메소드로 달성 할 수있는 유용한 예제로 phpcodetips.blogspot.com/2008/07/domain-model-validation.html
grom

6
동의하지 않는다. 이것은 Smalltalk, Ruby & Python의 유사한 기능보다 훨씬 약합니다 (아마도 이들 중 하나에서 복사 된 것
같습니다

34
PHP의이 기능 구현이 다른 언어보다 약하다는 사실은 PHP에서 그 기능을 덜 유용하게 만들지 않습니다.
Allain Lalonde

2
__call()맵 domain.com/controller/method/와 프레임 워크에 중대하다
알렉스

7
마법 방법도 지옥만큼 느립니다. 주의해서 사용하십시오.
Alex Weinstein

95

표준 클래스 깔끔한 컨테이너입니다. 나는 최근에 그것에 대해서만 배웠습니다.

배열을 사용하여 서버 속성을 보유하는 대신

$person = array();
$person['name'] = 'bob';
$person['age'] = 5;

당신은 표준 클래스를 사용할 수 있습니다

$person = new stdClass();
$person->name = 'bob';
$person->age = 5;

이것은 문자열에서 이러한 변수에 액세스 할 때 특히 유용합니다

$string = $person['name'] . ' is ' . $person['age'] . ' years old.';
// vs
$string = "$person->name is $person->age years old.";

43
"{$ person [ 'name']}은 {$ person [ 'age']} 살"입니다.
Kornel

27
것 또한 작업 ... 아니 따옴표, 아니 중괄호 : "사람 [이름] $ 사람 [세] 세입니다"
majelbstoat

16
$ string = sprintf ( "% s은 (는) % d 년입니다.", $ person [ 'name'], $ person [ 'age']);
Daniel Sloof가

60
우리가 주제에있는 동안 : (object) array ( "name"=> 'bob', 'age'=> 5)
Annika Backstrom 2016

30
@majelbstoat : PHP 인터프리터가 'name'과 'age'가 define (...)으로 설정되어 있는지 확인하기 때문에 따옴표를 사용하면 스크립트 속도가 느려집니다. 각 경우에 액세스되는 키를 완전히 뒤집을 수 있다는 점을 고려하면 나쁜 습관입니다. define ( 'age', 'name'); define ( 'name', 'age');
brianreavis

90

포함 파일 에는 변수에 할당 할 수 있는 반환 값 이있을 수 있습니다.

// config.php
return array(
    'db' => array(
        'host' => 'example.org',
        'user' => 'usr',
        // ...
    ),
    // ...
);

// index.php
$config = include 'config.php';
echo $config['db']['host']; // example.org

@Peter VERY 는 db-> localhost 예외 오류 처리에 유용합니다.
Talvi Watia

빠르고 더러운 구성 파일을 설정하는 것이 편리합니다.
Frank Farmer

왜이 배열을 반환합니까? 포함 된 파일에 배열이 포함되어 있으면 즉시 포함에서 사용할 수 있습니다.
fabrik

5
@fabrik은 전역 변수이므로 전체 주 범위에서 사용할 수 있기 때문입니다. 그것은 매우 불쾌합니다.이 방법이 더 좋습니다.
Mikulas Dite

나는 Yii 프레임 워크의 프로젝트에서 일했고 그 프로젝트에는 배열이 다음과 같이 반환 된 구성 파일이 있습니다. 이제 파일이 왜 그런지 이해합니다.
Simer Twilio Toronto 개발자

83

or연산자가 =이를 수행하는 것보다 우선 순위가 낮다 는 사실을 활용할 수 있습니다 .

$page = (int) @$_GET['page'] 
  or $page = 1;

첫 번째 대입 값이으로 평가 true되면 두 번째 대입은 무시됩니다. 다른 예시:

$record = get_record($id) 
  or throw new Exception("...");

7
나는 이것이 내가 생각하는 것을 확신하지 못한다. 오류가 발생하기 쉽지는 않지만 반 직관적이며 그 자체로 오류가 발생할 수 있습니다.
thomasrutter

14
@Pies : 한 가지 방법은 다음과 같이 매우 지저분한 코드입니다. $ page = isset ($ _ GET [ 'page'])? (int) $ _ GET [ 'page'] : 1; // 오류 억제가 필요하지 않다는 장점이 있습니다.
DisgruntledGoat

3
두 번째 생각에 정수를 찾고 있기 때문에 대신 사용할 수 있습니다 : $ page = is_int ($ _ GET [ 'page'])? $ _GET [ 'page'] : 1;
DisgruntledGoat

4
or이전 코드 or가 숫자 값이면 결과 이후 코드 가 실행 된다는 점에 주목할 가치가 0있습니다. 따라서 의미 상으로는와 같은 가능성이 적을 수 $_GET['page']있지만 분명히 상황이 발생할 수 있으며 조심하는 것이 좋습니다.
eyelidlessness 2009

3
또한 or운영자가 이전 버전의 운영자 임을 주목할 가치가 ||있습니다. 또한 +1이기 때문에 표현력이 높고 가능하다는 사실을 종종 잊습니다. 더 자주 사용해야하며 그 기능이 절대적으로 명확합니다. 그래도 "실제 남성"코드가 어떻게 작동하는지 모르겠으므로 이에 대해서는 언급 할 수 없습니다.
eyelidlessness 2009

80

__autoload()에 의해 지원되는 (class-) 파일 set_include_path().

PHP5에서는 괜찮은 OOP를 수행 할 때 "include_once"문장의 긴 목록을 지정할 필요가 없습니다.

클래스 라이브러리 파일이 깔끔하게 구조화 된 작은 디렉토리 세트를 정의하고 자동 포함 경로를 설정하십시오.

set_include_path(get_include_path() . PATH_SEPARATOR . '../libs/');`

이제 __autoload()루틴 :

function __autoload($classname) {
    // every class is stored in a file "libs/classname.class.php"

    // note: temporary alter error_reporting to prevent WARNINGS
    // Do not suppress errors with a @ - syntax errors will fail silently!

    include_once($classname . '.class.php');
}

이제 PHP는 필요에 따라 필요한 파일을 자동으로 포함하여 구문 분석 시간과 메모리를 절약합니다.


spl_autoload_register ()를 사용하는 것이 더 낫습니까?
alex

19
물론이야! __autoload ()는 PHP4이지만 spl_autoload_register ()는 자동로드 방법의 비파괴적인 "데이지 체인"입니다.
Willem

3
편리한 기능이지만 한 가지주의 할 점은 주어진 클래스의 인스턴스를 찾을 때 클래스 파일의 위치를 ​​찾기가 조금 더 어렵다는 것입니다. 맨 위에 포함을 명시 적으로 정의하면 포함 된 클래스 및 정확한 위치의 유한 목록이 제공됩니다.
코리 하우스

좋은 기능이지만 코드가 사전 컴파일되지 않은 상황을 피하기 위해 클래스의 위치를 ​​모릅니다. 이것의 큰 단점은 서로 다른 네임 스페이스에 있더라도 동일한 이름을 가진 2 개의 클래스를 가질 수 없다는 것입니다.
Kibbee

3
자동 로딩을 구현할 때 PHP Standards Working Group (ZF, Symfony, Doctrine, CakePHP, Solar 등의 기능을 갖춘 개발자)의 PSR-0 propsal을 살펴보십시오 : groups.google.com/group/php-standards/web / psr-0-final-proposal
필립 거버

76

용이성 . 가장 큰 특징은 새로운 개발자가 "작동하는"스크립트를 작성하고 코드를 이해하는 것이 얼마나 쉬운 지입니다.

최악의 기능은 새로운 개발자가 "작동하는"스크립트를 작성하고 코드를 이해하는 것이 얼마나 쉬운 지입니다.

PHP를 둘러싼 커뮤니티개방성 과 오픈 소스로 제공되는 방대한 양의 PHP 프로젝트는 개발 세계에 들어가는 사람에게 훨씬 덜 위협적이며 여러분처럼 더 성숙한 언어로의 발판이 될 수 있습니다.

필자는 기술적 인면에 대해 많은 논의를하지 않겠지 만, PHP를 웹 언어가 아닌 커뮤니티로 개발한다면, 개발을 시작할 때 분명히 당신을 포용 한 커뮤니티라면 혜택은 실제로 스스로에게 도움이됩니다.


3
확실히 좋은 의견. 파이썬은 제 첫 언어 였고 대단했습니다. 그러나 이해할 수 있다고 생각한 프로젝트가 결여되어 장벽을 만들었습니다. PHP를 사용하면 문서에서 거의 모든 것을 찾아서 알아낼 수 있습니다 ... 웹에서 사용할 수있는 리소스는 훌륭합니다.
dscher

76

의심 할 여지없이 변수 변수와 함수 !

$foo = 'bar';
$bar = 'foobar';
echo $$foo;    //This outputs foobar

function bar() {
    echo 'Hello world!';
}

function foobar() {
    echo 'What a wonderful world!';
}
$foo();    //This outputs Hello world!
$$foo();    //This outputs What a wonderful world!

동일한 개념이 객체 매개 변수에도 적용됩니다 ($ some_object-> $ some_variable).

아주 아주 좋은. 루프와 패턴으로 코딩하는 것은 매우 쉽고, eval (Thanx @Ross & @Joshi Spawnbrood!)보다 더 빠르고 제어가 쉽습니다 .t


111
변수 변수는 실제로 코드를 읽기 어렵고 오류가 발생하기 쉽습니다.
Elzo Valugi

8
사람들이 정말로 이것을 사용합니까? 이 소스를 읽는 것이 싫어요.
Gary Willoughby

27
변수 변수는 PHP가 제공하는 최악의 기능 중 하나입니다.
davidtbernal

10
변수 변수는 배열로 대체되는 것이 10 배가되므로 모든 데이터를 한 곳에 모아서 반복 할 수 있습니다. 매우 특정한 상황에서만 유용 할 수 있습니다.
Jasper Bekkers 2009

7
초보자가 그 "기능"을 사용하지 않도록하십시오.
whiskeysierra

68

당신이 사용할 수있는 인수의 정의되지 않은 수의 기능을 를 사용하여 func_get_args().

<?php

function test() {

    $args = func_get_args();
    echo $args[2]; // will print 'd'
    echo $args[1]; // will print 3
}

test(1,3,'d',4);

?>

1
이 글을 게시하려고했습니다. JS 함수의 arguments 속성과 비슷합니다.
alex

67

나는 원격 파일을 좋아한다 . 웹 개발의 경우 이러한 종류의 기능이 매우 유용합니다.

웹 페이지의 내용으로 작업해야합니까? 간단한

$fp = fopen('http://example.com');

다른 일반 파일과 마찬가지로 파일 핸들을 준비했습니다.

아니면 원격 파일이나 웹 페이지를 문자열로 직접 읽는 것은 어떻습니까?

$str = file_get_contents('http://example.com/file');

이 특정 방법의 유용성은 과장하기 어렵다.

원격 이미지를 분석하고 싶습니까? FTP를 통해하는 것은 어떻습니까?

$imageInfo = getimagesize('ftp://user:password@ftp.example.com/image/name.jpg');

파일로 작동하는 거의 모든 PHP 함수는 원격 파일로 작동 할 수 있습니다. 이 방법으로 원격으로 파일을 코딩 include()하거나 require()코딩 할 수 있습니다 .


2
이다 그래서 좋은! 예를 들어 Java 에서이 작업을 수행하려면 gazillion jar 파일을 포함하고 많은 상용구 코드를 작성해야합니다.
Kimble

16
"이러한 방식으로 원격으로 코드 파일을 include () 또는 require () 할 수도 있습니다." 물론 제어하지 않는 서버에 파일을 포함시키는 것은 끔찍한 생각입니다.
Frank Farmer

4
@Frank은 - 네, 물론, 하나는 당신이 서버에서 코드를 포함 할 것이라고 추정 할 제어.
zombat

1
요컨대, 원격 파일 포함은 일반적인 PHP 보안 문제입니다 : en.wikipedia.org/wiki/Remote_File_Inclusion#PHP .
Frank Farmer

63

strtr ()

매우 빠르기 때문에 놀랄 것입니다. 내부적으로는 미친 접두사 형식 구조를 사용하여 공통 접두사로 일치하는 항목을 정렬합니다. 나는 200 개 이상의 찾기 및 바꾸기 문자열과 함께 사용하며 여전히 100ms 미만으로 1MB를 통과합니다. 사소하게 작은 문자열을 제외하고 strtr ()은 문자 집합을 고려하더라도 똑같은 일을 할 때 strtolower ()보다 훨씬 빠릅니다. 연속적인 strtr 호출을 사용하여 전체 파서를 작성할 수 있으며 일반적인 정규 표현식 일치보다 빠르며 토큰 유형을 파악하고 다음 정규 표현식을 출력합니다.

나는 텍스트를 단어로 나누고, 소문자를 나누고, 구두점을 제거하는 등의 텍스트 노멀 라이저를 작성하고 있었고 strtr은 스위스 군용 칼이었습니다. 정규 표현식에서 바지를 치거나 심지어 str_replace ().


1
단일 문자 교체를 수행하기 때문에 아마도 더 빠릅니다.
staticsan 2016 년

10
strtr ()은 단일 문자 교체 만 수행하지 않습니다. 임의의 길이의 하위 문자열을 다른 임의의 길이의 하위 문자열로 바꿀 수 있으며 여전히 정말 빠릅니다.
thomasrutter

1
어떤 경우에는 그것이 strtolower보다 빠르다고 언급했습니다. 증명할 수 있습니까? 나는 작은 벤치 마크를했고 그것이 틀렸다는 것을 알았습니다.
픽셀 개발자

1
80 문자의 작은 문자열에서는 strtolower보다 느리고 1MB의 큰 문자열에서는 더 빠릅니다. 호출 될 때마다 고정 비용 유형 오버 헤드가있을 수 있습니다. 나는 단순히 strtr ($ this-> string, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); 내가 작업했던 문자열은 전형적인 영어 텍스트 ( "빠른 갈색 여우", 그런 종류)였습니다.
thomasrutter

방금이 게시물을 읽은 후 Google에서 검색하여 다음을 찾았습니다. simplemachines.org/community/index.php?topic=175031.0 어느 것이 옳은지 아십니까 ?
Flipper

61

PHP의 잘 알려지지 않은 기능 중 하나 extract()는 연관 배열을 로컬 네임 스페이스로 압축 해제하는 함수입니다. 이것은 아마도 autoglobal abormination에 존재하지만 templating에 매우 유용합니다 :

function render_template($template_name, $context, $as_string=false)
{
    extract($context);
    if ($as_string)
        ob_start();
    include TEMPLATE_DIR . '/' . $template_name;
    if ($as_string)
        return ob_get_clean();
}

이제 당신은 사용할 수 있습니다 render_template('index.html', array('foo' => 'bar'))$foo값과 "bar"템플릿에 나타납니다.


15
extract ()가 좋은 기능이라고 제안한 것에 대해 화를 낼 것입니다. 그러나 나는 그것을 사용하는 것이 매우 편리하다고 생각합니다. 나는 그것이 좋은 생각에 사용 된 것을 본 적이 있다고 생각합니다!
thomasrutter

5
extract ()는 매우 가벼운 템플릿 템플릿을 롤링하는 것을 간단하게 만듭니다. +1
Dinah

14
그것의 반대 인 compact ()도 훌륭합니다 : $ a = 1; $ b = 2; 콤팩트 ( 'a', 'b'); // == array ( 'a'=> $ a, 'b'=> $ b)
Annika Backstrom 2016

2
예, 아마도 extract ()를 실제로 사용하는 유일한 방법 일 것입니다.
staticsan 2016 년

4
extract ()에서 $ context가 'as_string'또는 'template_name'인덱스의 값을 포함 할 수 있으므로이 경우 공통 단어를 함수 인수 이름으로 사용하지 않는 것이 좋습니다. 사용 EXTR_SKIP이 허용됩니다,하지만 (즉, 그것의 잘못된 값을 얻을 것이다 as_string $를 기대 템플릿이됩니다.) 다른 문제를 이동
마이클 Tatarynowicz

52

Range () 자체는 숨겨져 있지 않지만 여전히 많은 사람들이 반복하는 것을 봅니다.

for ($i=0; $i < $x; $i++) { 
    // code...
}

그들이 사용할 수있을 때 :

foreach (range(0, 12) as $number) {
    // ...
}

그리고 당신은 같은 간단한 일을 할 수 있습니다

foreach (range(date("Y"), date("Y")+20) as $i)
{
print "\t<option value=\"{$i}\">{$i}</option>\n";
}

3
foreach ($ array as $ key => $ value) {}를 수행하면 더 간단합니다.
SilentGhost 2016 년

15
미세 최적화 일 수도 있지만 foreach보다 훨씬 빠르며 메모리 집약적이라는 점은 주목할 가치가 있습니다.
JAL

3
파이썬을 사용해보십시오. "for i in range (12)"처럼 간단하거나 더 효율적인 xrange를 사용할 수 있습니다.
Ponkadoodle

2
@SilentGhost : 여전히 배열이 필요하지만 항상 그런 것은 아닙니다. @Newbie : 정교하게 부탁드립니다.
Alec

1
@flexxy, 적절하게는 아닙니다. 이것을 고려하십시오 : phpbench.com 아래로 스크롤 하십시오 Read Loop.
버디

44

PHP 가능 웹 공간 은 일반적으로 (asp) .net을 사용하는 것보다 저렴합니다. 그 기능을 ;-)라고 부를 수 있습니다.


3
모든 서버에서 Windows Server를 지불 할 필요가없는 경우 여러 서버를 설정하는 것이 훨씬 저렴합니다.
MiffTheFox 2016

4
Windows가 비용 효율적인 곳이라는 것을 아는 유일한 곳은 서버 관리자에게 Linux에서 관리자를 교육하는 것보다 100 부의 창을 사는 것이 저렴합니다. 나를 슬프게하지만 창 설정이 깨끗하고 잘 설정되었습니다).
dcousineau 2016 년

4
지금은 단 한 번만 전환하면되지만 조만간 새 라이센스를 구입해야합니다.
e-satis

42

그만큼 static키워드는 OOP의 관점 유용한 벗어납니다. 다음과 같은 간단한 방법으로 '메모리'또는 함수 캐싱을 빠르고 쉽게 구현할 수 있습니다.

<?php
function foo($arg1)
{
    static $cache;

    if( !isset($cache[md5($arg1)]) )
    {
        // Do the work here
        $cache[md5($arg1)] = $results;
    }

    return $cache[md5($arg1)];
}
?>

그만큼 static키워드 만 실행 과거 해당 함수의 범위 내에서 지속되는 변수를 생성한다. 이 기술은 데이터베이스에 충돌 get_all_books_by_id(...)하거나 get_all_categories(...)페이지로드 중에 두 번 이상 호출하는 함수에 유용 합니다.

주의 사항 : 해시의 열쇠를 만드는 가장 좋은 방법을 찾으십시오. md5(...)위의 모든 상황에서 위의 결정은 좋지 않습니다 (속도 및 출력 길이 문제). 나는 설명 목적으로 사용했습니다. sprintf('%u', crc32(...))또는 spl_object_hash(...)상황에 따라 훨씬 더 할 수있다.


7
C / C ++에서 복사 한 기능
GetFree

2
@GetFree 나는 거의 모든 PHP가 C, C ++, Perl 등으로부터 복사되었다는 것을 부인할 수 없다고 생각합니다.
Frank Farmer

1
복사 할 수있는 최선의 방법입니다.
NikiC

1
나쁜 PHP. 항상 다른 사람의 기능을 복사합니다. 대신 처음부터 모든 것을 써야합니다! (이것이 심각하게 받아 들여질 가능성이 가장 적은 경우 : 농담입니다)
Halil Özgür

42

PHP의 좋은 기능 중 하나는 CLI 입니다. 설명서에서 "홍보"되지 않았지만 일상적인 스크립트 / 콘솔 응용 프로그램이 필요한 경우 cron + php cli를 사용하면 개발 속도가 빠릅니다!


나는 이것을 정말로 살펴 봐야한다. 나는 다음을 통해 PHP 스크립트를 가져 오는 여러 cron 작업을 가지고있다wget http://example.com...
DisgruntledGoat

CLI는 오류보고 환경 설정을 변경하지 않고도 경고 / 오류가 표시되므로 스팟 디버깅에 탁월한 방법입니다.
Glacials

40

그런 다음 "및 인쇄"트릭

<?php $flag and print "Blah" ?>

$ flag가 true이면 Blah를 에코합니다. ECHO와 함께 작동하지 않습니다.

이것은 템플릿에서 매우 편리하며? : 정말 읽기 쉽지 않습니다.


24
나는 스스로 삼항 연산자가 논리적이고 짧은 평가의 악용을 이용하는 것보다 훨씬 더 분명하다는 것을 안다.
Vicent Marti

26
? 사실 <PHP ($ 플래그) 인쇄 "어쩌구"처럼 같은 수의 문자의 그
너무 많은 PHP

3
괄호는 "그리고"만큼 입력하기 쉽지 않습니다. 특히 피 묻은 프랑스어 키보드에서 ;-)
e-satis

7
@ 모든 의견-이것은 얼마나 짧을 수 있는지에 관한 것이 아닙니다! 프로그래머가 아닌 템플릿 사용자의 가독성과 사용 편의성에 관한 것입니다.
토르 발라 모

6
if () 문이 더 쉽고 읽기 쉽습니다. PHP에서 'and'연산자의 부작용을 본질적으로 악용하는 것보다 실수를 저지르는 것보다 확실히 이해하기가 더 쉽습니다. 예를 들어, 명시된 바와 같이 이것은 'echo'에서 원하는 방식으로 작동하지 않습니다. if ()를 사용하면 이와 같은 문제가 없습니다.
thomasrutter

37

다음 과 같이 변수 이름에 빼기 문자를 사용할 수 있습니다 .

class style
{
  ....
  function set_bg_colour($c)
  {
    $this->{'background-color'} = $c;
  }
}

왜 사용합니까? 모르겠다 : 아마도 CSS 모델 일까? 또는 이상한 JSON을 출력해야합니다. 이상한 특징입니다 :)


2
메소드 이름으로 작동합니까? 라우터를 사용하는 프레임 워크에 유용 할 수 있으며 domain.com/something-with-minuses/view/를 원합니다
alex

6
중괄호를 사용하면 대시, 점 및 기타 영숫자가 아닌 개체가있는 개체 속성에 액세스 할 수 있습니다. 이것을 사용하는 한 가지 이유는 엔티티 이름이 NITF / NewsML <body.content> 에서처럼 점으로 표시 될 수있는 xml을 처리 할 때입니다. SimpleXML을 사용하면 다음과 같이 액세스 할 수 있습니다 $item->DataContent->body->{'body.content'}.
Jesse Kochis

2
PHP 변수는 공백과 줄 바꿈을 포함하여 이러한 방식으로 사용될 때 모든 문자를 사용할 수 있습니다.
Newbie

이것은 SimpleXML에서 사용할 때 매우 유용합니다 ... 굉장합니다. 공유해 주셔서 감사합니다.
KyleFarris

34

HEREDOC 구문은 내가 가장 좋아하는 숨겨진 기능입니다. <<<에 대해 Google을 사용할 수 없기 때문에 항상 찾기가 어렵지만 큰 HTML 덩어리를 이스케이프 처리하지 않아도 변수를 스트림에 드롭 할 수 있습니다.

echo <<<EOM
  <div id="someblock">
    <img src="{$file}" />
  </div>
EOM;

2
HEREDOC은 SQL 문을 작성하고 사용하는 가장 좋아하는 방법입니다.
bdl

11
참고 : EOM 닫기; 들여 쓰기 할 수 없습니다.
micahwittman

템플릿을 사용하면 좋지만 의미가 없습니다. 또한 적절한 들여 쓰기를 방해합니다.
Manos Dilaverakis

7
신 이시여, 그것은 내가 본 것 중 가장 추악한 코드입니다. HEREDOC을 사용하는 경우 프레젠테이션을 논리와 분리하지 않은 것입니다.
Lotus Notes

@Byron : 프리젠 테이션에 사용할 필요가 없으며 모든 문자열에 사용할 수 있습니다. bdl의 의견을 참조하십시오.
Tom Pažourek

34

함수 매개 변수의 기본값으로 상수 "변수"를 지정할 수 있다는 것을 아는 사람은 많지 않습니다.

function myFunc($param1, $param2 = MY_CONST)
{
//code...
}

문자열배열 인 것처럼 사용할 수 있습니다 .

$str = 'hell o World';
echo $str; //outputs: "hell o World"

$str[0] = 'H';
echo $str; //outputs: "Hell o World"

$str[4] = null;
echo $str; //outputs: "Hello World"

3
마지막은 멋지다. 나는 그것이 캐릭터를 제거하는 다른 방법보다 낫다는 것을 전혀 모른다. 그럼에도 불구하고 +1
George Mauer

3
아마도 함수를 호출하는 것보다 더 효율적일 것입니다. 문자열은 일반적으로 메모리에 연속적으로 저장되므로 $ str [4]에 도달하는 것은 쉽지 않습니다. 문자열을 문자 배열로 저장하는 것은 C에서 파생 된 대부분의 언어에 공통적입니다.
sjobe

1
정의 된 상수를 기본값으로 사용할 필요는 없습니다. 함수 foot ($ param1, $ default = array ( 'key'=> 'value'), $ default_s = 'String', $ default_i = 10, $ default_b = false)도 완벽하게 유효합니다. 그러나 변수를 기본 인수로 사용할 수 없다는 점은 정확합니다.
dcousineau 2016 년

@dcousineau array ()는 함수가 아니라 언어 구성이므로 예제는 완벽하게 유효합니다. 함수 호출은 인수의 기본값으로 허용되지 않습니다.
Jamol

4
멀티 바이트 문자열 (외국어 등)이있는 경우 문자열을 배열로 취급하는 데주의하십시오.
philfreo

33

PHP 코드에 대한 가장 유용한 점은 함수를 제대로 이해하지 못하면 브라우저를 사용하여 입력하여 찾을 수 있다는 것입니다.

http://php.net/function

지난 달에는 일부 코드에서 "범위"기능을 보았습니다. 그것은 결코 사용하지 않았지만 실제로는 유용한 것으로 밝혀진 수백 가지 기능 중 하나입니다.

http://php.net/range

이 URL은 http://us2.php.net/manual/en/function.range.php 의 별칭입니다 . 함수와 키워드를 urls매핑 한다는 간단한 아이디어 는 대단합니다.

다른 언어, 프레임 워크, 데이터베이스, 운영 체제가 문서를 찾는 간단한 메커니즘을 갖기를 바랍니다.


5
range()유용 할 수 있습니다foreach( range(1, 10) as $i) { };
alex

FireFox가있는 경우 PHP function주소 표시 줄에 입력 하면 Google '운이 좋은 느낌입니다'검색을 수행하며 거의 항상 올바른 PHP 문서 페이지가 표시됩니다.
Kolky

30

빠른 차단 설명

/*
    die('You shall not pass!');
//*/


//*
    die('You shall not pass!');
//*/

이러한 주석을 사용하면 코드 블록에 한 문자로 주석을 달 경우 전환 할 수 있습니다.


14
이것은 실제로 PHP에만 국한된 것은 아닙니다. 이것은 // ...라인 주석 및 /* ... */블록 주석 을 지원하는 모든 언어로 작동합니다 .
Jordan Ryan Moore

모든 코드 정리 유틸리티는 이것을 사용하여 당신을 싫어하게 ... ...)
Talvi Watia

3
나는 또한 /** /전후에 사용했습니다 /**/. 첫 번째 공간을 제거하고 추가하여 블록을 토글 할 수 있습니다. 이것은 CSS (및 // ... 주석을 지원하지 않는 다른 언어)로 작업 할 때 추가 이점이 있습니다 .
kingjeffrey


@aleemb,이 질문에 대한 추가 편집은 자제하십시오.
Sam152

29

내 목록 .. 대부분은 "즐겨 찾기 기능"( "희망!")보다 "숨겨진 기능"에 속하며 모두 유용하지는 않지만 .. 예.

// swap values. any number of vars works, obviously  
list($a, $b) = array($b, $a);

// nested list() calls "fill" variables from multidim arrays:  
$arr = array(  
  array('aaaa', 'bbb'),  
  array('cc', 'd')  
);  
list(list($a, $b), list($c, $d)) = $arr;  
echo "$a $b $c $d"; // -> aaaa bbb cc d  

// list() values to arrays  
while (list($arr1[], $arr2[], $arr3[]) = mysql_fetch_row($res)) { .. }  
// or get columns from a matrix  
foreach($data as $row) list($col_1[], $col_2[], $col_3[]) = $row;

// abusing the ternary operator to set other variables as a side effect:  
$foo = $condition ? 'Yes' . (($bar = 'right') && false) : 'No' . (($bar = 'left') && false);  
// boolean False cast to string for concatenation becomes an empty string ''.  
// you can also use list() but that's so boring ;-)  
list($foo, $bar) = $condition ? array('Yes', 'right') : array('No', 'left');

삼항 연산자도 중첩 할 수 있으며 때로는 편리합니다.

// the strings' "Complex syntax" allows for *weird* stuff.  
// given $i = 3, if $custom is true, set $foo to $P['size3'], else to $C['size3']:  
$foo = ${$custom?'P':'C'}['size'.$i];  
$foo = $custom?$P['size'.$i]:$C['size'.$i]; // does the same, but it's too long ;-)  
// similarly, splitting an array $all_rows into two arrays $data0 and $data1 based  
// on some field 'active' in the sub-arrays:  
foreach ($all_rows as $row) ${'data'.($row['active']?1:0)}[] = $row;

// slight adaption from another answer here, I had to try out what else you could  
// abuse as variable names.. turns out, way too much...  
$string = 'f.> <!-? o+';  
${$string} = 'asdfasf';  
echo ${$string}; // -> 'asdfasf'  
echo $GLOBALS['f.> <!-? o+']; // -> 'asdfasf'  
// (don't do this. srsly.)

${''} = 456;  
echo ${''}; // -> 456  
echo $GLOBALS['']; // -> 456  
// I have no idea.  

좋아, 나는 지금 멈출 것이다 :-)


흠, 오랜만이야 ..

// just discovered you can comment the hell out of php:
$q/* snarf */=/* quux */$_GET/* foo */[/* bar */'q'/* bazz */]/* yadda */;

따라서 중괄호로 묶으면 모든 문자열을 메소드 이름으로 전달할 수 있음을 발견했습니다. 문자열을 메서드로 정의 할 수는 없지만 __call ()로 문자열을 잡아서 필요에 따라 더 처리 할 수 ​​있습니다. 흠 ...

class foo {
  function __call($func, $args) {
    eval ($func);
  }
}

$x = new foo;
$x->{'foreach(range(1, 10) as $i) {echo $i."\n";}'}();

Reddit 의견 에서이 작은 보석을 찾았습니다.

$foo = 'abcde';
$strlen = 'strlen';
echo "$foo is {$strlen($foo)} characters long."; // "abcde is 5 characters long."

당신은 직접이 같은} {내부 함수를 호출 할 수 없습니다,하지만 당신은 할 수 있습니다 변수를 - 보유 - 더 - 함수 이름을 사용하고 그 전화! (그리고 변수 변수도 사용할 수 있습니다)


2
삼항 비교 연산자를 과도하게 사용하지 마십시오. 이로 인해 코드가 난독 화됩니다.
staticsan 2016 년

와. 그것은 당신의 $ GLOBALS 목록을 완전히 호스로 만들 수 있습니다. 나쁜 연습. 진심으로.
Talvi Watia

난독 화 된 PHP 컨테스트가 아직 있습니까?
Lotus Notes

스왑을 사용한 트릭-인상적이고 유용합니다. 감사합니다.
OZ_

1
${''} = 456;하하하 .. 꽤 남용.
Skurmedel

26

배열 조작.
어레이 작업 및 조작을위한 다양한 도구. PHP에 고유하지는 않지만 그렇게 쉬운 언어로 작업 한 적이 없습니다.


예를 들어 무엇을 좋아합니까? 함수가 모두 어색하게 명명되고 전역 네임 스페이스에 배치 된 것처럼 보입니다. 게다가 나는 어쩌면 $ 편곡을 제외하고 다른 언어로 그냥 쉽게 아무것도 그게 전부 생각할 수 없다 [] = $ NEWVALUE 값을 추가 - 그게 전부는 냉각
조지 마우어

8
PHP 배열은 스택, 큐, deque, 목록, 해시 테이블 등으로 쉽게 사용할 수있는 데이터 구조입니다. array_ * 함수 이외의 다른 것에 의지하지 않고 가장 일반적인 요구에 매우 유연합니다.
Camilo Díaz Repka

6
파이썬은 PHP보다 배열 (리스트 및 튜플)을 훨씬 잘 수행합니다.
너무 많은 PHP

26

나는 당신과 약간 비슷합니다. 8 년 이상 PHP를 코딩했습니다. 약 1 년 전에 .NET / C # 과정을 수강해야했고 C # 언어 (ASP.NET을 싫어함)를 정말 좋아했지만 더 나은 PHP 개발자가되었습니다.

언어로서의 PHP는 꽤 나쁘지만, 나는 그것에 매우 빠르며 LAMP 스택은 훌륭합니다. 최종 제품은 부품 합계보다 훨씬 큽니다.

귀하의 질문에 대한 답변으로,

http://uk.php.net/SPL

나는 SPL을 좋아한다 C #의 컬렉션 클래스 인 좋아한다. 이제 케이크를 먹고 먹을 수 있습니다.

앤드류


24

아무도 아직 언급하지 않은 것에 대해 조금 놀랐지 만 배열에서 내가 좋아하는 트릭 중 하나는 더하기 연산자를 사용하는 것입니다. 조금 비슷 array_merge()하지만 조금 더 간단합니다. 나는 그것이 일반적으로 내가 원하는 것을 발견했습니다. 실제로 RHS의 모든 항목을 가져와 LHS 사본에 표시하여 필요에 따라 덮어 씁니다 (예 : 비정기적임). "기본"배열로 시작하여 하나의 적중에 실제 값을 모두 추가하는 한편, 제공되지 않은 값에 대한 기본값을 그대로 두는 데 매우 유용합니다.

요청 된 코드 샘플 :

// Set the normal defaults.
$control_defaults = array( 'type' => 'text', 'size' => 30 );

// ... many lines later ...

$control_5 = $control_defaults + array( 'name' => 'surname', 'size' => 40 );
// This is the same as:
// $control_5 = array( 'type' => 'text', 'name' => 'surname', 'size' => 40 );

$defaults해야$control_defaults
diEcho

3
유지 보수 할 코드가 많을 때 array_merge만큼 명확하지 않다고 생각합니다. 적어도 array_merge 함수를 사용하면 배열을 다루는 것이 분명합니다.
Sylvain

그리고 당신이하고 있다는 사실 ... + array( ...이 이것을 지적하기에 충분하지 않습니까? :-)
staticsan

어떤 버전의 PHP가 필요합니까?
Lotus Notes

이것은 훌륭한 기능이며 "+"의 "오른쪽"에있는 어레이는 어레이의 기존 키를 "+"의 "왼쪽"에 덮어 쓰지 않습니다.
Wil Moore III

21

다음 은 제공되지 않는 함수 매개 변수에 기본값을 설정 하는 것이 훨씬 쉬운 방법입니다.

function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }

4
유감스럽게도 지난 주 Google 리더에서이 "숨겨진 기능"을 보았습니다. 나는 숨겨진 것을 얻지 못합니다-기본 구문입니다. 예를 들어 if ($ var = true)를 시도하십시오.
Ross

8
무엇보다 쉬워? 대부분의 언어에는이 기능이 있습니다.
Christian Davén 2009

10
C #보다 쉽고 (그리고 C ++과 Java라고 생각합니다)
George Mauer

8
C ++는 기본 매개 변수 값을 지원합니다.
sjobe

2
c #은 기본값을 전혀 지원하지 않습니다. 오버로드 된 함수를 작성하고 항상 성가신 값을 선언해야합니다
DeveloperChris

21

빠르고 더러운 것이 기본값입니다.
언어는 유용한 지름길로 가득 차 있습니다. 이는 PHP가 시장 출시 기간이 짧은 (소규모) 프로젝트를위한 완벽한 후보입니다. 깨끗한 PHP 코드가 불가능하지는 않지만 약간의 노력과 경험이 필요합니다.

그러나 나는 에세이를 입력하지 않고 원하는 것을 표현할 수 있기 때문에 PHP를 좋아합니다.

PHP :

if (preg_match("/cat/","one cat")) {
   // do something
}

자바:

import java.util.regex.*;
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat")
if (m.find()) {
  // do something
}

그리고 예, Int를 입력하지 않는 것이 포함됩니다 .


4
대신에 strpos를 사용해야합니다 : if (false! == strpos ( "one cat", "cat")) {
OIS

17
@OIS 그의 예제의 목적은 "한 고양이"에서 문자열 "cat"을 찾는 방법이 아니라 빠른 정규식 일치 실행을 설명하고 비교하는 것이 었습니다.
dcousineau 2016 년

19
Java : if (Pattern.matches ( "cat", "one cat")) {// 무언가를}} 모르는 경우 java에 대한 불평을 중지하십시오.
whiskeysierra

3
+1 Willi 어떻게합니까 preg_replace ( '/ ([<[]!-\ s *) (\ S *?) (\ s *-[>]]?) / se', "\ $ this- > ( '\\ 1', '\\ 2', '\\ 3', \ $ data) ", $ text)를 선택하십시오. 자바? 입력 텍스트에서 주석을 찾은 다음 일치하는 요소가있는 함수를 호출합니다.이 경우 $ this-> choose (...)는 일치하는 항목을 대체하고 결과를 반환합니다.
DeveloperChris

1
정규식은 PHP가 엉망입니다 ... //언어에 내장 된 Perl 또는 JavaScript 스타일의 정규식을 사용하고 싶습니다 .
cdmckay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.