PHPの隠された機能?[閉まっている]


174

これは要注意の質問のように聞こえますが、どこから来たのかを説明させてください。

大学卒業後、PHPショップに就職しました。私は1年半の間そこで働き、プログラミングについて学ぶことはすべて学んだと思っていました。

それから私は、すべての仕事がC#で行われているかなりの規模の企業で、1人の社内開発ショップとして仕事を得ました。私はその地位への取り組みの中で、大量のブログや本を読み始め、すぐに自分がすべてを知っていると考えるのがいかに間違っているかを理解しました。ユニットテスト、依存関係の注入とデコレータのパターン、疎結合の設計原則、継承の議論に対する構成などについて繰り返し学びました。それでも、すべてを非常に吸収しています。言うまでもなく、私のプログラミングスタイルは昨年完全に変更されました。

今、私は友人のスタートアップのためにいくつかのコーディングを行っているphpプロジェクトを拾い上げていることに気づき、C#でのプログラミングとは対照的に完全に制約されていると感じています。クラスのスコープにあるすべての変数は、 '$ this->'を追加して参照する必要があることを本当に気にします。私が試したどのIDEも非常に優れたインテリセンスを備えておらず、SimpleTestユニットテストのメソッドは「test」という単語で始まる必要があることは不愉快です。動的型付けにより、メソッドが予期するパラメーターの型を暗黙的に指定できなくなり、メソッドのオーバーロードを行うには、switchステートメントを記述しなければならないことに夢中になります。名前空間をネストできず、::演算子を使用して基本クラスのコンストラクターを呼び出さなければならないことは理解できません。

今、私はPHPとC#の議論を始めるつもりはありません。むしろ私が言っていることは、私が知らないか、知らないPHP機能がいくつかあり、それでも正しく使用できないことです。私はC#の世界に取り掛かり、ガラスのボウルの外を見るのが困難です。

だから私は尋ねています、PHPのあなたの好きな機能は何ですか?.Net言語ではできないことや、.Net言語で難しいことは何ですか?


OOパラダイムが壊れている?私にとっては、あなたが発見した最悪の「隠された」機能です。
knoopx 2009

これらのスレッドはちょっとおもしろいです...チームにとって「隠し機能」を扱うのは「バグ」を意味するコードフレーズだからです。そして、あなたは何を知っています...隠された機能を発見することは必ずしも良いことではありません...
Ganesh Shankar

@Ganesh ある人のバグは別の人の隠し機能です...
Xeoncross

回答:


328

ドキュメンテーションドキュメントには、私の票を取得します。プログラミング言語のより完全なオンラインドキュメントに出会ったことはありません。他に、さまざまなWebサイトやmanページから集めなければならないすべてのものです。


60
同意する。www.php.net/function_nameと入力して、ほとんどの場合リファレンスを取得できることは素晴らしいことです。
Allain Lalonde、

1
これはPHPの優れた機能ですが、実際には非表示とはしません...メソッドのパラメーターなどをグーグル検索したことがあれば、php.netに到達することになります。
ジョンブブリスキー

27
私も同意します。このマニュアルの最大の特徴は、ユーザーのコメントです。他のドキュメントにそれらが含まれていることはほとんどありません。彼らは本物の宝石を含むことができます。唯一の欠点は、私見彼らがあまりにも早く剪定されていることです。
サンダーマレシャル

3
@Phoexo "少し読みにくい" ??? PHPのドキュメントは簡単で明確ですが、MSDNを理解したことはなく、MSDNを理解することもありません。
lauriys

3
同意しない。ドキュメントが「良い」という唯一の理由は、公式コメントのすべての穴を塞いでいるユーザーコメントの一部が原因です。
Rob Howard

179

配列。この質問への回答から判断すると、PHPの配列がいかに簡単で便利かを人々が十分に理解しているとは思えません。PHP配列は、リスト、マップ、スタック、および汎用データ構造として同時に機能します。配列は言語コアに実装されており、あらゆる場所で使用されているため、CPUキャッシュの局所性が良好です。PerlとPythonはどちらも、リストとマップに別々の言語構成を使用しているため、コピーが多くなり、変換が混乱する可能性があります。


11
PHP配列要素は順序付けられています。
user8134 2009

117
PHPからC#への最初の移行で、ほとんど死んでしまいました。C#では、配列は静的なサイズと数値インデックスを持つ単純な構造です。PHPでは、配列は宇宙のダクトテープです。
ダイナ

4
私も同意します。Javaを使ってUniの割り当てを試してみたところ、柔軟性がまったくなく、それらがいかに厳格であるかに驚きました。PHP配列がいかに優れているかに本当に感謝しました。
クリスチャン、

11
php配列はすばらしいと思いますが、C#配列をノックするコメントに40票投票しますか?C#配列がニーズに合わない場合、多くのオプションがあります。ArrayListとジェネリックコレクションはどちらも非常に強力です。特定のニーズに応じて、さまざまな種類のコレクションがあります。この点でphp の唯一の実際の利点は、プログラマーが決定する必要のあるオプションを提供しないことです。配列を使用するか、インデックス付け可能な変数がありません。
G-Wiz

24
一方で、配列の構文は完全に最悪です。多くのスクリプト言語では、次のような単純な2D配列を作成できます:[[1, 2], [3, 4]]、これをPHPバージョンと比較してください:array(array(1, 2), array(3, 4))
Rene Saarsoo、2010

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

21
適切なOOアプローチを持つIMHOは、ストリームハンドラーを使用したこの混乱よりはるかに賢明です。はい、Excelファイルを読み書きできるのはかわいいですが、このように動作する必要がありますか?
アンチヴィーラナ2009

3
たぶんそうかもしれませんが、このアプローチは、ほとんどのPHP開発者に共通するインターフェースに複雑さをカプセル化しています。それらを超えるオブジェクト指向の概念を学ぶ必要はありません。
Allain Lalonde、

13
Amazon S3を使用している場合は、Zend_Amazon_S3をチェックしてください。Zend_Amazon_S3は、 's3:// {bucket-name} / path'のようなURLのストリームインターフェイスを提供します。
davidtbernal 2009

これを使用して、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言語構造(IteratorおよびIteratorAggregate)、およびcount関数(Countable)です。


4
後藤魔法の方法で達成することができるものの有用な例としてphpcodetips.blogspot.com/2008/07/domain-model-validation.html
GROM

6
同意しない。これは、Smalltalk、Ruby、Pythonの同様の機能よりもはるかに弱い(そしておそらくこれらのいずれかからコピーされた)
finnw

34
PHPのこの機能の実装が他の言語よりも弱いという事実は、PHPでの有用性を低下させるものではありません。
Allain Lalonde、

2
__call()map 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
「person [name] is $ person [age] years old」も機能します...引用符、中括弧はありません:)
majelbstoat

16
$ string = sprintf( "%sは%d歳です。"、$ person ['name']、$ person ['age']);
Daniel Sloof、2009年

60
件名について:(object)array( "name" => 'bob'、 'age' => 5)
Annika Backstrom

30
@majelbstoat:PHPインタープリターが「name」と「age」がdefine(...)で設定されているかどうかを確認するため、引用符を削除するとスクリプトの速度が低下します。それぞれのケースでアクセスされるキーを完全に反転させることが可能であることを考えると、悪い習慣でもあります。define( 'age'、 'name'); define( '名前'、 '年齢');
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

簡単で汚い設定ファイルを設定するのに便利です。
フランクファーマー

なぜこの配列を返すのですか?インクルードされたファイルに配列が含まれている場合、インクルードですぐに使用できます。
fabrik 2010

5
@fabrikはグローバル変数であり、メインスコープ全体で使用できるためです。それはかなり不愉快です、これはずっと良いです。
Mikulas Dite、2010

私はYiiフレームワークでプロジェクトに取り組み、そのプロジェクトには配列がこのように返された構成ファイルがあり、ファイルがこのようになっている理由がわかりました。
Simer Twilioトロントの開発者2010

83

or演算子の優先順位=がこれよりも低いという事実を利用できます。

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

最初の割り当ての値がに評価されるtrue場合、2番目の割り当ては無視されます。もう一つの例:

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

7
私はこれについて私は確信していません。エラーが発生しにくいように見えても直感に反し、それ自体でエラーが発生する可能性があります。
thomasrutter 2009年

14
@Pies:正直に言うと、次の非常に厄介なコードが1つの方法です:$ 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']が、明らかに状況が発生する可能性があるので、注意する必要があります。
まぶたがない2009

3
また、このor演算子は以前のバージョンの演算子であることに注意してください||。また、+ 1は非常に表現力豊かであり、それが可能であることをしばしば忘れているためです。それはより頻繁に使用されるべきであり、それが何をするかは絶対に明らかです。「本物の男性」がどのようにコーディングするかはわかりませんので、コメントすることはできません。
まぶたがない2009

80

__autoload()によって支援された(クラス)ファイル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()を使用する方が良いですか?
アレックス

19
もちろん!__autoload()はPHP4ですが、spl_autoload_register()は自動ロードメソッドの非破壊的な「デイジーチェーン」です。
ウィレム

3
便利な機能ですが、1つの注意点は、特定のクラスのインスタンスを見つけたときに、クラスファイルの場所を探すのが少し難しくなることです。上部で明示的にインクルードを定義すると、関係するクラスとその正確な場所の有限リストが表示されます。
Cory House

これは優れた機能ですが、コードがプリコンパイルされていない状況を回避するためだけなので、クラスがどこに配置されるのかわかりません。これの大きな欠点は、たとえ名前空間が異なっていても、同じ名前のクラスを2つ持つことができないことです。
Kibbee 2009

3
自動ロードを実装する場合は、PHP標準作業グループ(ZF、Symfony、Doctrine、CakePHP、Solarなどの開発者)のPSR-0プロポーザルをご覧ください。groups.google.com/group/php-standards/ web / psr-0-final-proposal
フィリップガーバー

76

簡単さ。最大の特徴は、新しい開発者が座って「機能する」スクリプトを記述し、コードを理解するのがいかに簡単かです。

最悪の機能は、新しい開発者が座って「動作する」スクリプトを記述し、コードを理解していると思うことがいかに簡単かです。

PHPを取り巻くコミュニティ開放性と、オープンソースとして利用可能な大量のPHPプロジェクトは、開発の世界に入っている人にとってはそれほど気が悪くなく、あなたのように、より成熟した言語への足がかりになる可能性があります。

私が以前に多くの技術的なことについて議論することはありませんが、PHPをWeb言語ではなくコミュニティー、つまり開発を始めたときに明らかに受け入れてくれたコミュニティーとして見ると、利点は実際に物語っています。


3
間違いなく良いコメント。Pythonは私の最初の言語で、すばらしい言語でしたが、理解できると感じたプロジェクトの欠如が障害を生み出しました。PHPを使用すると、ドキュメントのほとんどすべてを調べて理解できます。Webで利用できるリソースは驚くべきものです。
dscher 2010

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 2009

8
そして、人々は本当にこれを使いますか?私はこれらのソースを読むのが嫌いだろう。
ゲイリーウィロビー

27
変数変数は、PHPが提供する最悪の機能の1つです。
davidtbernal 2009

10
9 10回のうち、変数変数は配列に置き換えた方がよいので、すべてのデータを1か所にまとめて、繰り返し処理することができます。一部の非常に特殊な状況でのみ、それらが役立ちます。
ジャスパーベッカーズ2009

7
初心者にその「機能」を使わせないでください。
ウイスキー

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プロパティのようなものです。
アレックス

67

リモートファイルが大好きです。Web開発の場合、この種の機能は非常に役立ちます。

Webページのコンテンツを操作する必要がありますか?シンプルな

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

他の通常のファイルと同じように、ファイルハンドルの準備ができました。

または、リモートファイルまたはWebページを文字列に直接読み込むのはどうですか。

$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でこれを行うには、膨大な量のjarファイルをインクルードし、その後多くのボイラープレートコードを記述する必要があります。
キンブル

16
「この方法で、コードファイルをリモートでinclude()またはrequire()することもできます。」もちろん、あなたが制御していないサーバー上のファイルをinclude()するのは、ひどい、ひどい考えです。
フランクファーマー

4
@フランク-はい、まあ、あなた制御したサーバーからのコードを含めることになると思います。
zombat 2010

1
つまり、リモートファイルのインクルードは、PHPの一般的なセキュリティ問題です:en.wikipedia.org/wiki/Remote_File_Inclusion#PHP
フランクファーマー

63

strtr()

それは非常に高速なので、驚くほどです。内部的には、おそらくいくつかのクレイジーなbツリー型構造を使用して、一致するものを共通のプレフィックスで配置します。200以上の検索と置換文字列で使用していますが、100ミリ秒未満で1 MBを通過します。文字セットを考慮に入れても、まったく同じことを行う場合、ごく小さな文字列を除いて、strtr()はstrtolower()よりも大幅に高速です。おそらく、連続するstrtr呼び出しを使用してパーサー全体を書くことができ、通常の正規表現の一致よりも速く、トークンの種類を把握し、これまたは次の正規表現のようなものを出力します。

私はテキストを単語に分割したり、小文字にしたり、句読点を削除したりするためのテキストノーマライザを書いており、strtrは私のスイスのアーミーナイフでした。


1
1文字の置換を行うため、おそらくより高速です。
staticsan 2009年

10
strtr()は、単一文字の置換を行うだけではありません。任意の長さの部分文字列を他の任意の長さの部分文字列に置き換えることができ、それでも本当に高速に見えます。
thomasrutter 2009年

1
場合によってはstrtolowerよりも速いとおっしゃっていましたが、それを証明できますか?小さなベンチマークを行ったところ、それが誤りであることがわかりました。
Pixel開発者

1
たとえば80文字の小さな文字列ではstrtolowerよりも遅く、たとえば1MBの大きな文字列ではそれよりも速いことがわかりました。呼び出されるたびに、固定コストタイプのオーバーヘッドが発生する可能性があります。私は単にstrtr($ this-> string、 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'、 'abcdefghijklmnopqrstuvwxyz');を使用していました。私が操作していた文字列は、いくつかの典型的な英語のテキスト( "The quick brown fox"など)でした。
thomasrutter

私はこの投稿を読んだ後、いくつかのGoogle検索を行って見つけました。simplemachines.org / community / index.phptopic = 175031.0どちらが正しいかわかり ますか?
Flipper

61

PHPのあまり知られていない機能の1つはextract()、連想配列をローカル名前空間にアンパックする関数です。これはおそらく、autoglobal aborminationのために存在しますが、テンプレート化に非常に役立ちます。

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 2009年

5
extract()を使用すると、独自の非常に軽量なテンプレートシステムを簡単にロールできます。+1
ダイナ

14
その逆であるcompact()も同様に素晴らしいです:$ a = 1; $ b = 2; コンパクト( 'a'、 'b'); // == array( 'a' => $ a、 'b' => $ b)
Annika Backstrom

2
はい、おそらくそれがextract()の唯一の本当に良い使い方です。
staticsan

4
この場合、関数の引数名として一般的な単語を使用しないことをお勧めします。extract()の$ contextには、 'as_string'または 'template_name'インデックスの値が含まれる可能性があるためです。使用EXTR_SKIPが許容されるが、唯一の他の場所で問題を移動(テンプレートは、それはそれのために不正な値を取得しますas_string $を期待している場合、すなわち。)
のMichał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 2009年

15
マイクロ最適化かもしれませんが、foreachはforeachよりもはるかに高速でメモリ使用量が少ないため、注目に値します。
JAL

3
Pythonを試してみてください。「for i in range(12)」のように簡単ですが、より効率的なxrangeを使用することもできます。
Ponkadoodle、2010

2
@SilentGhost:まだ配列が必要ですが、常にそうであるとは限りません。@初心者:詳しく説明してください?
アレック

1
@flexxy、見た目は違います。これを考慮してください:phpbench.comがまでスクロールしRead Loopます。
バディ

44

PHP対応のウェブスペースは通常、(asp).netを使用するものよりも安価です。あなたそれを機能と呼ぶかもしれません ;-)


3
また、すべてのサーバーでWindows Serverの料金を支払う必要がない場合は、複数のサーバーをセットアップする方がはるかに安価です。
MiffTheFox

4
私のWindowsが費用対効果の高い場所を知っている唯一の場所は、私の部署がLinuxで管理者をトレーニングするよりもWindowsの100コピーを購入する方が安いのと同じくらいサーバーソフトウェアがSTEEEEP割引を受ける大学です(部分的に私は悲しくなりますが、ウィンドウのセットアップはクリーンで適切にセットアップされています)。
dcousineau 2009年

4
今のところ、スイッチを1回だけ変更する必要がありますが、遅かれ早かれ新しいライセンスを購入する必要があります...
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、2009

2
@GetFree PHPのほとんどすべてがC、C ++、Perlなどからコピーされたことを誰もが否定することはないと思います
Frank Farmer

1
コピーはできる最高のことです。
NikiC 2010

1
悪いPHP。常に他の機能をコピーしています。代わりに、すべてを最初から書き込む必要があります。(これが真剣に
受け取ら

42

PHPの優れた機能の1つはCLIです。ドキュメントではそれほど「宣伝」されていませんが、ルーチンスクリプト/コンソールアプリが必要な場合は、cron + php cliを使用すると開発が非常に速くなります。


私は本当にこれを調べる必要がありますwget http://example.com...
。PHP

エラーレポートの設定を変更せずに警告/エラーが表示されるため、CLIはスポットデバッグの優れた方法でもあります。
Glacials、2011

40

次に、「印刷」のトリック

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

$ flagがtrueの場合、Blahをエコーし​​ます。ECHOでは機能しません。

これはテンプレートで非常に便利で、?:それは本当に読みにくいです。


24
私自身、三項演算子は、論理ANDの評価短絡を利用するよりもはるかに明白です。
Vicent Marti

26
実際、これは<?php if($ flag)print "Blah"と同じ文字数です
あまりにも多くのphp

3
括弧は "and"ほど簡単には入力できません。特に、私の流血のフランス語キーボードでは、;-)
e-satis

7
@すべてのコメント-これは、どれだけ短くできるかということではありません!それは、時にはプログラマーでさえないテンプレートの人々のための読みやすさと使いやすさについてです。
Tor Valamo、2010年

6
if()ステートメントの方が簡単で読みやすいとコメントします。間違いを犯しやすい(または後でコードを読むときに間違いのように見える)PHPの「and」演算子の本質的な副作用を利用するよりも、頭を動かす方が確かに簡単です。たとえば、前述のように、これは「エコー」を使用した場合、希望どおりに機能しません。if()では、このような問題はありません。
thomasrutter 2010

37

次のように、変数名にマイナス文字を使用できます。

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

なぜそれを使うのですか?わからない:たぶんCSSモデルのために?または、出力する必要があるいくつかの奇妙なJSON。それは奇妙な機能です:)


2
メソッド名で動作しますか?ルーターを使用していて、domain.com
something

6
中括弧を使用すると、ダッシュ、ドット、およびその他の英数字以外のエンティティを持つオブジェクトプロパティにアクセスできます。これを使用する理由の1つは、XMLを扱う場合です。エンティティ名は、NITF / NewsML <body.content>のようにドットで区切ることができます。SimpleXMLを使用する場合は、次のようにアクセスします$item->DataContent->body->{'body.content'}
Jesse Kochis

2
PHP変数は、そのように使用すると、スペースや改行も含めて、任意の文字を使用できます。
2010

これは、SimpleXMLで使用する場合に非常に役立ちます。共有いただきありがとうございます。
カイルファリス

34

HEREDOC構文は、私のお気に入りの隠し機能です。Googleで<<<を検索できないため、常に見つけるのは困難ですが、HTMLの大きなチャンクをエスケープする必要がなくなり、変数をストリームにドロップできます。

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

2
HEREDOCは、SQLステートメントを作成して使用するためのお気に入りの方法です。
bdl

11
注:終了EOM; インデントすることはできません。
micahwittman、2010年

良いですが、テンプレートを使用しても意味がありません。さらに、それは適切なインデントの邪魔になります。
Manos Dilaverakis、2010

7
親愛なる神、これは私が今まで見た中で最も醜いコードです。HEREDOCを使用している場合は、プレゼンテーションをロジックから分離していません。
Lotus Notes

@Byron:プレゼンテーションに使用する必要はなく、任意の文字列に使用できます。bdlからのコメントを参照してください。
TomPažourek10年

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
ジョージマウアー

3
おそらく、関数を呼び出すよりも効率的です。文字列は通常、連続してメモリに格納されるため、$ str [4]にアクセスするのは簡単です。文字の配列として文字列を格納すると、Cから派生するほとんどの言語に共通する
sjobe

1
定義済みの定数をデフォルト値として使用する必要はありません。以下も完全に有効です:function foot($ param1、$ default = array( 'key' => 'value')、$ default_s = 'String'、$ default_i = 10、$ default_b = false)。ただし、デフォルトの引数として変数を使用できないことに注意してください。
dcousineau 2009年

@dcousineau array()は関数ではなく言語構造なので、この例は完全に有効です。関数呼び出しは、引数のデフォルト値として許可されていません。
Jamol 2009

4
マルチバイト文字列(外国語など)がある場合は、文字列を配列として扱うことに注意してください
philfreo

33

PHPコードに関する最も便利なことの1つは、関数がよくわからない場合は、ブラウザーを使用して次のように入力することで調べられることです。

http://php.net/function

先月、いくつかのコードで「範囲」関数を見ました。これは、私が使用したことのない何百もの関数の1つですが、本当に役立つことがわかりました。

http://php.net/range

そのURLはhttp://us2.php.net/manual/en/function.range.phpのエイリアスです。関数とキーワードをurlsマッピングするという単純なアイデアは素晴らしいです。

他の言語、フレームワーク、データベース、オペレーティングシステムに、ドキュメンテーションを検索するための単純なメカニズムがあることを願っています。


5
range()次の場合に役立ちますforeach( range(1, 10) as $i) { };
アレックス

FireFoxをお持ちの場合 ただ入力しPHP functionた検索「私は幸運を感じている」とあなたはほとんど常に右PHPのドキュメントページに終わるそれがグーグルを行いますアドレスバーに。
Kolky

30

高速ブロックコメント

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


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

これらのコメントにより、コードブロックが1文字でコメント化されているかどうかを切り替えることができます。


14
これは実際にはPHPに固有のものではありません。これは、// ...行コメントと/* ... */ブロックコメントをサポートする任意の言語で機能します。
ジョーダンライアンムーア

コードクリーンアップユーティリティは、これを使用することを嫌います...;)
Talvi Watia 2010年

3
/** /前後にも使ってい/**/ます。最初のスペースを削除して追加することで、ブロックを切り替えることができます。これには、CSS(および// ... コメントをサポートしていない他の言語)を使用するという利点があります。
kingjeffrey 2010年


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

このように{}内の関数を直接呼び出すことはできません、variables-holding-the-function-nameを使用して呼び出すことができます。(*そして*あなたもそれに変数変数を使うことができます)


2
三項比較演算子を使いすぎないでください。これにより、コードが難読化されます。
staticsan 2009年

ワオ。それはあなたの$ GLOBALSリストを完全にホースすることができます。悪い習慣。真剣に。
Talvi Watia

難読化されたPHPコンテストはまだありますか?
Lotus Notes

さて、スワップでトリック-印象的で便利、ありがとう。
OZ_

1
${''} = 456;ははは……かなりの虐待。
Skurmedel

26

配列操作。
配列を操作および操作するための多数のツール。PHPに固有のものではないかもしれませんが、これほど簡単な言語で作業したことがありません。


たとえばどうですか?関数はすべて、扱いにくい名前が付けられ、グローバル名前空間に配置されているように思えます。プラス私は、値を追加するための[] = $ NEWVALUE多分$ ARRを除き、他の言語ではないだけで簡単として何かのthatsを考えることができない- thatsのクール
ジョージマウアー

8
まあ、PHP配列は、スタック、キュー、デキュー、リスト、ハッシュテーブルなどとして簡単に使用できるデータ構造です。array_*関数以外に頼ることなく、ほとんどの一般的なニーズに対応できる柔軟性があります。
CamiloDíazRepka 2008

6
Pythonは配列(リストおよびタプル)をPHPよりもはるかに優れています。
phpが多すぎる

26

私はあなたに少し似ています。PHPを8年以上コーディングしてきました。約1年前に.NET / C#コースを受講する必要があり、C#言語(嫌いなASP.NET)を本当に楽しんでいましたが、それによってPHP開発者はより良くなりました。

言語としてのPHPはかなり貧弱ですが、私は非常に迅速で、LAMPスタックは素晴らしいです。最終製品はパーツの合計をはるかに上回ります。

そうは言っても、あなたの質問に答えて:

http://uk.php.net/SPL

私はSPLが大好きです。C#のコレクションクラスは、使い始めてすぐに気に入ったものでした。これでケーキを食べられます。

アンドリュー


24

まだ誰も言及していないので少し驚いていますが、配列での私のお気に入りのトリックの1つは、plus演算子を使用することです。少し似てarray_merge()いますが、もう少し単純です。たいていはそれが私が欲しいものだとわかりました。実際には、それはRHSのすべてのエントリを取得し、LHSのコピーにそれらを表示させ、必要に応じて上書きします(つまり、非可換です)。「デフォルト」の配列から始めて、いくつかの実際の値を1つのヒットですべて追加する一方で、提供されていない値のデフォルト値はそのままにしておくのに非常に役立ちます。

要求されたコードサンプル:

// 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 2010

3
維持するコードが多い場合、array_mergeほど明確ではないと思います。少なくとも、array_merge関数を使用すると、配列を扱っていることがわかります。
2010年

そして、あなたがしているという事実は、... + array( ...これを指摘するのに十分ではありませんか?:-)
staticsan

これにはどのバージョンのPHPが必要ですか?
Lotus Notes

これは優れた機能であり、「+」の「右側」にある配列は、「+」の「左側」にある配列の既存のキーを上書きしないことに注意してください。
Wil Moore III

21

ここに1つあります。提供されていない関数パラメーターにデフォルト値を設定する方がはるかに簡単です。

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

4
おかしなことに、先週Googleリーダーでこの「隠された機能」を見ました。何が隠されているのかわかりません。基本的な構文です。たとえばif($ var = true)を試してください。
ロス

8
何よりも簡単ですか?ほとんどの言語にこの機能があります。
クリスチャンダベン2009

10
C#よりも簡単です(C ++やJavaだと思います)
George Mauer、

8
C ++はデフォルトのパラメーター値をサポートします。
sjobe 2009年

2
c#はデフォルト値をまったくサポートしていません。オーバーロードされた関数を作成し、常に値を宣言する必要があります。これは非常に扱いにくい
DeveloperChris

21

デフォルトは、Quick and Dutyです。
言語には便利なショートカットがたくさんあります。これにより、PHPは市場投入までの時間が短い(小規模な)プロジェクトの完全な候補になります。クリーンなPHPコードは不可能ではなく、追加の労力と経験が必要です。

しかし、エッセイを入力せずに自分の欲しいものを表現できるPHPが大好きです。

PHP:

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

JAVA:

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彼の例の目的は、「1つの猫」で「cat」という文字列を見つける方法ではなく、正規表現の一致の実行を説明および比較することでした。
dcousineau 2009年

19
Java:if(Pattern.matches( "cat"、 "one cat")){//何かをする}知らない場合はJavaについて文句を言うのをやめます。
ウイスキーシエラ

3
+1ウィリーpreg_replace( '/([<[]!-\ s *)(\ S *?)(\ s *-[>]]?)/ se'、 "\ $ this- > Choose( '\\ 1'、 '\\ 2'、 '\\ 3'、\ $ data) "、$ text); Javaで?これにより、入力テキスト内のコメントが見つかり、一致した要素を使用して関数が呼び出されます。この場合、$ this-> choose(...)は、一致するものを置き換えて結果を返します。
DeveloperChris

1
正規表現はPHPはかなりひどいです...私はむしろ//言語に組み込まれているPerlまたはJavaScriptスタイルの正規表現が欲しいです。
cdmckay 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.