source

PHP의 숨겨진 기능

manysource 2022. 11. 5. 17:38

PHP의 숨겨진 기능

요점을 따지는 질문처럼 들리겠지만 내가 무슨 말을 하는지 설명해줄게.

대학 졸업 후 나는 PHP 숍에 취직했다.저는 그곳에서 1년 반 동안 일하면서 프로그래밍을 배우기 위해 모든 것을 배웠다고 생각했습니다.

그 후, 대기업의 1인 사내 개발 숍에 취직해, 모든 일이 C#에 있었습니다.그 자리에 전념하면서 저는 블로그와 책을 많이 읽기 시작했고, 제가 모든 것을 안다고 생각하는 것이 얼마나 잘못된 것인지 금세 깨달았습니다.유닛 테스트, 의존성 주입 및 데코레이터 패턴, 느슨한 커플링의 설계 원리, 상속에 대한 구성 등, 지금까지도 매우 만족하고 있습니다.말할 필요도 없이 작년에 내 프로그래밍 스타일은 완전히 바뀌었다.

지금 나는 친구의 스타트업을 위해 코딩 작업을 하고 있는 php 프로젝트를 집어들고 있고, C#에서의 프로그래밍과는 달리 완전히 제약을 받고 있다.클래스 범위의 모든 변수를 '$this->'를 추가하여 참조해야 한다는 점이 매우 신경 쓰입니다.지금까지 시도한 IDE 중 인텔리센스가 매우 좋은 IDE가 하나도 없고 SimpleTest 유닛 테스트 방법이 'test'라는 단어로 시작되어야 한다는 점이 마음에 걸립니다.다이내믹 타이핑으로 인해 메서드에서 예상되는 파라미터 유형을 암묵적으로 지정할 수 없게 되어 메서드 과부하를 실행하기 위해 스위치스테이트먼트를 쓸 필요가 있는 것은 매우 화가 납니다.네스트된 네임스페이스를 사용할 수 없고 :: 연산자를 사용하여 기본 클래스의 생성자를 호출해야 하는 것은 참을 수 없습니다.

PHP vs C#에 대한 논의를 시작할 생각은 없습니다.그게 아니라 제가 모르는 PHP 기능이나 아직 제대로 사용하지 못하는 기능이 있다는 것을 알고 있습니다.나는 C#의 세계를 배경으로 유리 그릇 밖을 보는 데 어려움을 겪고 있다.

그래서 저는 당신이 PHP에서 가장 좋아하는 기능은 무엇입니까?에서는 할 수 없는 일 또는 어려운 일은 무엇입니까?인터넷 언어?

문서. 서류는 내 표가 된다.프로그래밍 언어에 관한 보다 철저한 온라인 문서를 본 적이 없습니다.다른 모든 것은 다양한 웹사이트와 man page에서 조합해야 합니다.

어레이. 이 질문에 대한 답변으로 미루어 볼 때, PHP의 어레이가 얼마나 쉽고 유용한지 사람들이 완전히 이해하지 못할 것 같습니다.PHP 어레이는 목록, 맵, 스택 및 일반 데이터 구조를 동시에 수행합니다.어레이는 언어 코어로 구현되어 어디에서나 사용되므로 CPU 캐시 로컬리티가 우수합니다.Perl과 Python은 모두 목록과 맵에 별도의 언어 구조를 사용하므로 더 많은 복사와 혼란을 초래할 수 있습니다.

스트림 핸들러를 사용하면 대부분의 다른 언어에서는 상당히 어려운 논리로 "파일 시스템"을 확장할 수 있습니다.

예를 들어 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);

매직 메서드는 존재하지 않는 메서드를 호출하거나 존재하지 않는 속성을 할당하거나 읽을 때마다 호출되는 폴스루 메서드입니다.

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는 더 많은 오버로드를 허용합니다. ★★★★★★★★★★★★★★★★★,[]오퍼레이터(Array Access),foreach언어 구성(IteratorIterator Aggregate) 및count함수(카운트 가능).

스탠다드 클래스는 깔끔한 용기입니다.최근에야 알았어요.

어레이를 사용하여 서버 속성을 유지하는 대신

$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.";

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

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

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

해서 '이렇게 하다'라는할 수 .or는 산 operator의 operator operator operator operator자 ]보다 낮다.= 위해서: to to to to to to to to to to to to to to to.

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

이 로 되었을 경우true두 번째 할당은 무시됩니다. 다른예로는 '있다'는 것입니다.

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

__autoload() (class-) 파일 지원:set_include_path().

PHP5에서는 적절한 OOP를 실행할 때 "include_once" 문의 긴 목록을 지정할 필요가 없습니다.

클래스 라이브러리 파일이 적절하게 구조화된 작은 디렉토리 세트를 정의하고 auto include 경로를 설정합니다.

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는 필요한 파일을 온디맨드 방식으로 자동으로 포함시켜 구문 분석 시간과 메모리를 절약합니다.

간단.가장 큰 특징은 신규 개발자가 앉아서 "작업" 스크립트를 작성하고 코드를 이해하는 것이 얼마나 쉬운가 하는 것입니다.

최악의 기능은 신규 개발자가 앉아서 "작업" 스크립트를 작성하고 코드를 이해한다고 생각하는 것이 얼마나 쉬운가 하는 것입니다.

PHP를 둘러싼 커뮤니티의 개방성과 오픈 소스로 이용할 수 있는 방대한 양의 PHP 프로젝트는 개발 세계에 진입하는 당신 같은 사람에게 훨씬 덜 위협적이며, 더 성숙한 언어로 가는 발판이 될 수 있습니다.

지금까지의 기술적인 것에 대해서는 논하지 않겠습니다만, PHP를 웹 언어가 아닌 커뮤니티로서, 개발을 시작했을 때 확실히 당신을 받아들인 커뮤니티로서 본다면, 그 메리트는 확실히 말할 수 있습니다.

변수와 함수는 의심의 여지가 없다!

$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)에도 같은 개념이 적용됩니다.

아주 아주 좋아요.루프나 패턴에 의한 코딩을 매우 간단하게 해, 평가보다 빠르고 제어가 용이합니다(Thanx @Ross & @Joshi Speanbrood!).t

다음 명령어를 사용하여 인수 수가 정의되지 않은 함수를 사용할 수 있습니다.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);

?>

리모트 파일을 좋아해요.웹 개발에 있어서 이러한 기능은 매우 유용합니다.

웹 페이지의 내용을 조작할 필요가 있습니까?단순.

$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()이 방법으로 원격으로 파일을 코드합니다.

strtr()

굉장히 빠른 속도입니다.놀라실 거예요.내부적으로는 crazy b-tree 타입의 구조를 사용하여 공통 프레픽스에 따라 일치를 정렬할 수 있습니다.200개 이상의 검색 및 치환 문자열과 함께 사용하지만 100ms 이내에 1MB를 통과합니다.거의 작은 문자열 strtr()은 문자 집합을 고려하더라도 동일한 작업을 수행하는 데 strtolower()보다 훨씬 빠릅니다.연속된 strtr 호출을 사용하여 전체 파서를 쓸 수 있으며, 일반적인 정규 표현 일치보다 빠를 수 있습니다. 토큰 유형을 알아내거나, 이것 또는 저것 출력하거나, 다음 정규 표현과 같은 것입니다.

텍스트를 단어로 분할하고, 소문자를 낮추고, 구두점을 삭제하는 텍스트 노멀라이저를 쓰고 있었는데, strtr은 스위스 군용 나이프였습니다.정규 표현이나 심지어 str_replace()를 물리쳤습니다.

PHP의 잘 알려지지 않은 기능 중 하나는 로컬 이름 공간에 관련 배열을 언팩하는 함수입니다.이것은 자동글로벌 아보마이션에 존재할 가능성이 높지만 템플릿 작성에는 매우 유용합니다.

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"을 사용하다

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

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

staticOOP를 사용하다다음과 같은 간단한 방법으로 쉽고 빠르게 '메모화' 또는 기능 캐싱을 구현할 수 있습니다.

<?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(...)★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

PHP의 좋은 기능 중 하나는 CLI입니다.매뉴얼에서는 그다지 "추진"되어 있지 않지만 일상적인 스크립트/콘솔 앱이 필요한 경우 cron + php cli를 사용하면 매우 빠르게 개발할 수 있습니다.

그런 다음 "인쇄" 트릭

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

$flag가 true이면 Blah를 에코합니다.에코에서는 동작하지 않습니다.

이것은 템플릿에서 매우 편리하며 읽기 쉽지 않은 ? :를 대체합니다.

변수 이름에는 다음과 같이 마이너스 문자를 사용할 수 있습니다.

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

왜 사용하나?모르겠어요. CSS 모델인가요?출력해야 할 이상한 JSON도 있습니다.이 기능은 이상합니다.

GREEDOC 구문은 내가 가장 좋아하는 숨겨진 특징입니다.<<<>>를 구글로 검색할 수 없기 때문에 항상 찾기 어렵지만, HTML의 큰 덩어리를 피할 필요가 없어지고 변수를 스트림에 드롭할 수 있습니다.

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

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

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"

PHP 코드의 가장 유용한 점은 내가 본 함수를 잘 이해하지 못하는 경우 브라우저를 사용하여 다음을 입력하면 찾을 수 있다는 것입니다.

http://php.net/function

지난달에 어떤 코드에서 "범위" 함수를 봤어요.이 기능은 수백 가지 기능 중 하나이지만 실제로 유용하게 사용할 수 있었습니다.

http://php.net/range

이 URL은 http://us2.php.net/manual/en/function.range.php의 에일리어스입니다.URL에 기능이나 키워드를 매핑하는 심플한 아이디어는 훌륭합니다.

다른 언어, 프레임워크, 데이터베이스, 운영체제는 문서를 검색하는 간단한 메커니즘을 가지고 있어야 합니다.

빠른 차단 코멘트

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


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

이러한 코멘트를 사용하면, 코드 블록에 1 문자의 코멘트를 붙이는지를 전환할 수 있습니다.

내 리스트..대부분은 "즐겨찾는 특징"보다 "숨겨진 특징"에 더 속하며, 모든 것이 유용한 것은 아니지만,네.

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

3진 연산자를 모을 수도 있고, 가끔은 편리합니다.

// 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."

이와 같이 {} 내의 함수를 직접 호출할 수는 없지만 변수 홀드 더 함수 이름을 사용하여 호출할 수 있습니다. (*그리고 변수*도 사용할 수 있습니다.)

어레이 조작
어레이를 조작하거나 조작하기 위한 툴이 풍부합니다.PHP만의 것은 아닐지 모르지만, 이렇게 쉬운 언어를 사용해 본 적은 없습니다.

나도 너와 비슷해, 8년 이상 PHP를 코드화했어.나는 을 먹어야만 했다.약 1년 전, NET/C# 코스에서 C# 언어(ASP를 싫어)를 매우 즐겼습니다.NET)를 통해 더 나은 PHP 개발자가 되었습니다.

언어로서의 PHP는 매우 서툴지만, 저는 매우 빠르고 LAMP 스택은 훌륭합니다.최종 제품이 부품의 합계를 훨씬 능가합니다.

질문에 대한 답변은 다음과 같습니다.

http://uk.php.net/SPL

SPL이 너무 좋아서 C# 컬렉션 수업은 시작하자마자 마음에 들었어요.이제 나는 내 케이크를 먹을 수 있다.

앤드류

아직 아무도 언급하지 않은 것에 조금 놀랐습니다만, 어레이에 대해 제가 가장 좋아하는 방법 중 하나는 플러스 연산자를 사용하는 것입니다.약간 이런 느낌이에요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 );

다음 중 하나는 제공되지 않는 함수 파라미터의 기본값 설정이 훨씬 쉬워졌다는 점입니다.

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

디폴트는 퀵 앤 더티입니다.
이 언어에는 유용한 숏컷이 가득하기 때문에 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를 입력하지 않는 것도 포함됩니다.

언급URL : https://stackoverflow.com/questions/61401/hidden-features-of-php