174

これは指摘する質問のように聞こえますが、私がどこから来たのかを説明させてください.

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

その後、すべての作業が C# で行われる大規模な企業で、1 人の社内開発ショップとして就職しました。このポジションに専念する中で、私は大量のブログや本を読み始めましたが、自分がすべてを知っていると考えることがどれほど間違っているかすぐに気づきました。単体テスト、依存性注入、デコレーター パターン、疎結合の設計原則、継承よりも構成に関する議論などについて学びました。言うまでもなく、私のプログラミング スタイルはこの 1 年で完全に変わりました。

今、私は友人のスタートアップのためにコーディングを行っているphpプロジェクトを手に取っていることに気づき、C#でのプログラミングとは対照的に、完全に制約されていると感じています。クラス スコープのすべての変数を '$this->' を追加して参照する必要があるのは、本当に気になります。私が試した IDE にはどれも優れたインテリセンスがなく、SimpleTest の単体テスト メソッドが「test」という単語で始まらなければならないことに腹を立てています。動的な型付けでは、メソッドが期待するパラメーターの型を暗黙的に指定できず、メソッドのオーバーロードを行うには switch ステートメントを作成する必要があることに気が狂いそうになります。ネストされた名前空間を持つことができず、:: 演算子を使用して基本クラスのコンストラクターを呼び出さなければならないことに我慢できません。

ここで、PHP と C# の議論を始めるつもりはありません。むしろ、私が知らない、または知っていても適切に使用できない PHP 機能がいくつかあると確信しているということです。私は自分の C# ユニバースに設定されており、ガラスのボウルの外を見るのに苦労しています。

そこでお聞きしたいのですが、PHP のお気に入りの機能は何ですか? .Net 言語ではできない、またはより難しいことで、できることは何ですか?

4

78 に答える 78

328

ドキュメンテーションドキュメントは私の投票を得ます。プログラミング言語に関するより完全なオンライン ドキュメントに出会ったことはありません。それ以外は、さまざまな Web サイトやマニュアル ページからまとめなければなりません。

于 2008-09-14T17:32:25.703 に答える
179

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

于 2008-09-15T16:33:28.847 に答える
167

ストリーム ハンドラーを使用すると、私の知る限り、他のほとんどの言語では非常に難しいロジックで "FileSystem" を拡張できます。

たとえば、MS-Excel Stream ハンドラを使用すると、次の方法で 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);
于 2008-09-14T17:30:13.430 に答える
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 が一部の演算子 ( ()or など) をオーバーロードできることに気付くかもしれません(string)。実際、PHP では、[]演算子 ( ArrayAccess )、foreach言語構造 ( IteratorおよびIteratorAggregate )、count関数 ( Countable ) など、さらに多くのオーバーロードが可能です。

于 2008-09-14T17:21:29.083 に答える
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.";
于 2008-11-01T07:42:37.170 に答える
90

インクルード ファイルには、変数に割り当てることができる戻り値を含めることができます。

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

// index.php
$config = include 'config.php';
echo $config['db']['host']; // example.org
于 2009-08-06T19:59:58.367 に答える
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 は必要なファイルをオンデマンドで自動的にインクルードし、解析時間とメモリを節約します。

于 2008-10-02T18:31:32.333 に答える
76

簡単。最大の特徴は、新しい開発者が座って「動作する」スクリプトを書き、コードを理解するのがいかに簡単かということです。

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

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

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

于 2008-09-16T13:39:09.943 に答える
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)。

とってもとっても素敵。ループとパターンを使用した Make のコーディングは非常に簡単で、eval よりも高速で制御しやすいです (@Ross と @Joshi Spawnbrood に感謝します!)。

于 2008-09-15T12:51:35.870 に答える
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);

?>
于 2009-07-09T12:24:41.120 に答える
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()

于 2009-05-20T06:07:15.847 に答える
63

strtr()

びっくりするくらいスピードが速いです。内部的には、おそらくクレイジーな b-tree タイプ構造を使用して、一致を共通のプレフィックスで並べ替えます。200 を超える文字列の検索と置換で使用していますが、それでも 100 ミリ秒未満で 1 MB を通過します。些細な文字列を除くすべての文字列に対して、strtr() は、文字セットを考慮に入れても、まったく同じことを行う際に strtolower() よりもはるかに高速です。おそらく、連続した strtr 呼び出しを使用してパーサー全体を作成でき、通常の正規表現の一致、トークンの種類の把握、これまたはあれの出力、次の正規表現のようなものよりも高速になります。

テキストを単語に分割したり、小文字化したり、句読点を削除したりするためのテキストノーマライザーを書いていました.strtrは私のスイスアーミーナイフでした.正規表現やstr_replace()を打ち負かしました.

于 2009-03-20T09:51:16.810 に答える
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'))のみ andを使用できます。$foo"bar"

于 2008-09-22T09:39:15.437 に答える
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";
}
于 2009-06-22T11:52:18.193 に答える
44

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

于 2008-09-14T20:15:51.520 に答える
42

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

于 2009-01-11T07:25:39.237 に答える
39

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

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

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

これはテンプレートで非常に便利で、? を置き換えます。: 本当に読みにくいです。

于 2008-10-06T11:11:23.727 に答える
37

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

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

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

于 2009-05-01T08:20:02.157 に答える
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"
于 2009-03-20T10:50:23.860 に答える
34

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

echo <<<EOM
  <div id="someblock">
    <img src="{$file}" />
  </div>
EOM;
于 2009-06-22T19:52:46.347 に答える
33

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

http://php.net/関数

先月、いくつかのコードで「範囲」関数を見ました。これは、私が使用することができなかった何百もの関数の 1 つですが、実際には非常に便利であることが判明しました。

http://php.net/range

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

他の言語、フレームワーク、データベース、オペレーティング システムに、ドキュメントを検索するためのシンプルなメカニズムがあればいいのにと思います。

于 2009-06-21T23:55:02.957 に答える
30

高速ブロック コメント

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


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

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

于 2009-06-21T02:24:00.870 に答える
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."

このように {} 内の関数を直接呼び出すことはできませんが、関数名を保持する変数を使用してそれらを呼び出すことができます! (*そして*変数変数も使用できます)

于 2009-06-21T22:43:32.760 に答える
26

私はあなたと少し似ています。私は 8 年以上 PHP をコーディングしてきました。私は約 1 年前に .NET/C# のコースを受講しなければならず、C# 言語 (ASP.NET は大嫌い) をとても楽しんでいましたが、それによって私はより優れた PHP 開発者になりました。

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

とはいえ、あなたの質問への答えとして:

http://uk.php.net/SPL

私はSPLが大好きです。C# のコレクション クラスは、使い始めてすぐに好きになったものです。今、私は自分のケーキを持って食べることができます.

アンドリュー

于 2008-09-22T09:47:02.703 に答える
26

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

于 2008-09-14T17:51:38.870 に答える
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 );
于 2009-06-22T00:39:06.067 に答える
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と入力しないことも含まれます。

于 2009-02-16T01:19:55.233 に答える
21

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

function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }
于 2008-09-14T15:22:38.120 に答える
16

ob_start()を介した出力バッファリングは、ほとんどの場合よりもはるかに便利です。ここでの最初の隠された機能は、ob_startがコールバックを受け入れることです。

function twiterize($text) {
    // Replace @somename with the full twitter handle
    return preg_replace("(\s+)@(\w)+(\s+)", "http://www.twitter.com/${2}", $text);
}

ob_start(twiterize);

次に、出力バッファをネストできます...前の例を使用して:

ob_start(parseTemplate);
 // ... 
 ob_start(twiterize);
   // ...
 ob_end_flush();
 // ... 
ob_end_flush();

ヘルプコンテンツ、テキスト広告、辞書/インデックス機能、リンク化、追跡目的のリンクリダイレクト、テンプレートエンジン、これら2つの組み合わせを使用することで、これらすべてが非常に簡単になります。

于 2009-06-30T03:51:39.567 に答える
16

を使用して、ネストされたループを終了できます (の不足を補うため)。例えばbreak N;goto

for (int i=0; i<100; i++) {
    foreach ($myarr as $item) {
        if ($item['name'] == 'abort')
            break 2;
    }
}

詳細はこちら - http://php.net/manual/en/control-structures.break.php

于 2010-06-24T14:50:03.547 に答える
15

実際、メソッドが期待する型を指定できないということについては、まったく正しくありません。期待どおりに機能します。

function foo ( array $param0, stdClass $param1 );

注:これは、「配列」およびオブジェクト名に対してのみ機能します。

などなど、独自のクラスを期待されるパラメーターとして渡すこともできます。メソッド/関数を別のもので呼び出すと、致命的なエラーが発生します。

PHP の優れたインテリセンスに関するもう 1 つのヒント。私たちは ZendStudio を使用していますが、メソッドに適切な PHPDoc を記述すれば、実際にははるかにうまく機能します。ヒンティング時にそれらを調べます。

于 2008-09-14T19:15:01.167 に答える
13

Ctype関数は、基本的な文字検証のためにpreg_match()よりも高速です。

ctype_alnum()—英数字をチェックし
ますctype_alpha()—英字をチェックします
ctype_cntrl()—制御文字を
チェックしますctype_digit()—数字をチェックします
...など。 。

于 2009-07-17T18:16:06.860 に答える
13

ウェブサイトに必要なものは何でもすぐにコーディングを開始できますか?

マジック メソッドとリフレクションに加えて、いくつかの興味深い関数は次のとおりです。

  1. serialize/ unserialize- SQL、Cookie、プロセス、フラットファイルを介して状態を保存します。いい物。
  2. json_encode/ json_decode- インスタント AJAX の楽しみ
  3. get_class- 疲れたルーズタイピングの瞬間に役立ちます
  4. call_user_func_array- コードを文字列として操作できる場合は強力です (動的と考えてください)。
  5. method_exists- 反射
  6. func_num_args / func_get_arg- 未知の引数 ftw
  7. set_error_handler/ set_exception_handler- スクリプト言語の非常に優れたデバッグ機能
于 2009-06-22T15:26:41.130 に答える
13

日付関数。一日中、多くの時刻情報と日付文字列を処理しなければならないので、strftime()strtotime()などの関数は最高です。

于 2009-03-20T09:56:37.047 に答える
13

a)マニュアル-- 非常に包括的で最新のものであり、問​​題を解決する際のインスピレーションの巨大な源 -- 行き詰まっていませんか? マニュアルをブラウズ/検索すると出てきます

b)配列- それらはプラスチックであり、連想インデックスがあり、簡単にネスト (!) して野生のデータ構造を構成できます。また、配列操作だけのための多数の関数があります。ああ、個別の変数を値の配列として扱うことについて言及しましたか?

c) eval()および同様の構造 (動的変数名や関数名など) により、柔軟性が大幅に向上します (また、自分が何をしているのかを知っていれば比較的安全です) - 基本的に独自のプロセス フローを定義するプログラムに勝るものはありません (または特定の実行) オンザフライ

d) おそらく最も簡単に見落とされがちなこと: ZEND エンジンのほとんどすべてがzVal (本質的にはポインタ参照のコレクション) であるため、関数の戻り値として何でも返す機能


また、1 つの優れた機能を指摘したいと思いますが、それは言語よりも PHP ソースに関連しています (したがって、個別にリストされています)。

e) C 拡張機能(主に OpenAL や SDL などの他のオブジェクトのインターフェース) の作成の容易さ - 優れたソース コード構造と、「外側」にあるのとほぼ同じ数の「内側」の強力なツール - 拡張する必要がある場合機能はほんの少し先です。

于 2008-09-16T11:31:36.007 に答える
12

filter_var関数。隠れた真珠ではありませんが、かなり新しいです。

于 2009-07-25T23:06:09.977 に答える
10

さて、私は最近、PHP で書かれた最初の GUI アプリケーションを有料の顧客に提供しました。バーコード リーダーまたは GUI プッシュボタン、チェックボックス、ラジオ ボタン、またはテキスト フィールドからデータを収集し、SQLite またはリモートの MySQL に保存し、他の Windows アプリを起動し、圧縮された XML レポートを電子メールの添付ファイルとして送信し、保存されたデータを暗号化および復号化し、サウンドを再生します。それが終わったら。

miniPHPWinbinderでそれを行いました。それは十分に隠されていますか?多くの PHP 開発者が実際にこれを試したことはないと思います。

于 2009-07-01T01:43:24.820 に答える
8

配列に要素を簡単に追加できます。

$my_array = array();
$my_array[] = 'first element';
$my_array[] = 'second element';

要素は何でもかまいません:オブジェクト、配列、スカラー...

于 2009-04-27T17:24:03.803 に答える
8

他の人が述べたように、コマンド ライン レベルで PHP を実行する機能は素晴らしいものです。データのクリーンアップとバックアップのために、常に PHP スクリプトを cron ジョブとして設定しています。次の行でファイルを開始するだけです。

#!/usr/bin/php5
<?php
// start coding here

PHP がシステムにインストールされている場所によって、最初の行が異なる場合があることに注意してください。

ここから、デーモンなどのより複雑なシステムレベルのプロセスに PHP を実装するのは簡単です。

于 2009-11-08T19:56:35.190 に答える
8

ショートハンド ブール チェーン

<?php

TRUE AND print 'Hello';
FALSE OR print 'World';

// Prints "Hello World";

// Complex example...
User::logged_in() or die('Not allowed');
User::is_admin() AND print 'Admin Area';

Web アクセス可能な領域に PHP ファイルがある場合、これは非常に便利です。このちょっとした情報を各ファイルの先頭に挿入することで、誰も index.php 以外のファイルにアクセスできないようにすることができます。

<?php defined('YOURCONSTANT') or die('Not allowed');

///rest of your code
于 2010-06-28T23:19:21.113 に答える
7

特定の事前定義されたタイプに対して変数を解析するための組み込みフィルター - 基本 (int/float など) をカバーするだけでなく、電子メール、URL、さらには変数が有効な正規表現である場合にもカバーします。

http://ch2.php.net/manual/en/book.filter.php

于 2008-09-22T09:52:09.850 に答える
6

ReflectionClassクラスは、特定のクラスに関する情報を提供します。

$classInfo = new ReflectionClass ('MyClass');
if ($classInfo->hasMethod($methodName))                                     
{
  $cm = $classInfo->getMethod($name);                                   
  $methodResult = $cm->invoke(null);
}

とりわけ、メソッドが存在するかどうかを確認して呼び出すのに役立ちます。

于 2009-10-10T18:44:28.217 に答える
6

型キャストctype_*関数は、クリーンなデータを確保するために重要になります。最近、例外を多用しており、エラー処理コードが大幅に簡素化されています。

この言語には多くのキラー機能があるとは言えません。(少なくとも、それらを探す機会はあまりありません。) 目立たない言語が気に入っています。

于 2008-09-15T14:23:07.443 に答える
5

preg_split()、array_intersect()、および array_intersect_key()。

于 2009-06-21T22:20:56.970 に答える
5

included.html から .jpeg まで、ほぼすべてのファイル タイプを使用できます。PHP の開始タグによってバインドされた内部で見つかったバイト文字列が実行されます。はい、goat.se のイメージには、通常のユーティリティ関数をすべて含めることができます。の内部動作はinclude、入力ファイルを文字列に変換し、php コードを解析することだと思います。

于 2010-06-22T02:06:13.570 に答える
4

私はそこにいる他のPHPユーザーに偏っています。必要に応じて答えや方向性を簡単に得ることができます。

于 2009-05-10T01:44:51.397 に答える
4

制御構造の代替構文

この構文を知らない人はたくさんいます。テンプレート作成に純粋なPHPを使用する場合、この構文は、HTMLテンプレートコードなどの単純な制御構造を、通常は変数を印刷する短いスタイルと組み合わせて組み合わせるifための、すてきでクリーンな方法を提供します。foreach<?= $myVar ?>

于 2009-07-07T14:41:18.783 に答える
4

テスト、データ プロバイダー、データ ドリブン テストなどをマークするための注釈が必要な場合は、ユニット テストに PHPUnit を使用することをお勧めします。言うまでもなく、継続的インテグレーション (クルーズ コントロール、バンブー、ハドソンなど) に関しては、すべてのインテグレーションが好きなようです。

PHP 5.3 は大きな飛躍であり、言語機能の点で十分に価値があります。端が荒いかもしれませんが、これはスタートアップであり、ローンチするまでにリリースが修正されます.

魔法のメソッド __invoke() だけでも大したことではありませんが、そのための相互メソッドはありません。それでも、array_map、array_reduce、array_filter、およびいくつかのラッパーと組み合わせると、驚くべき関数型プログラミングを行うことができます。

__get、__set、および __call も非常に便利です。5.3 より前のトレイトを実装するために、これらといくつかのインターフェース/クラス命名規則のトリックを使用しましたが、今ではトレイトもあります。

また、ezComponents の derik rethans によって書かれた補遺ライブラリと XDebug 名声も見てください。これにより、php 5+ の注釈を行うことができます。悪くはありませんし、パフォーマンスはキャッシングの問題ではありません。

プロファイリングには、xdebug + webcachegrind を使用できます。

最適な IDE は、おそらく無料の Eclipse PDT です。パラメーターに型ヒントを使用し、パラメーターと戻り値に phpdoc コメントを使用すると、それらから物事を把握し、コード補完を提供できます。それはあなたにまともなインテリセンスを与えるはずです。

ところで、あらゆる種類のクレイジーな文字列連結、変数変数、変数メソッド呼び出し、または変数クラス作成を複数の場所で行うのは魅力的です。これは十分に文書化されておらず、正規表現を介して簡単に検索できません。ねじ込みました。デバッグは大変ですが、リファクタリングは大きな苦痛です。これは、PHP には自動化されたリファクタリング ツールがなく、大規模なコード ベースのリファクタリングは php で行うのが非常に難しいと考えられることはめったにありません。

マルチバイト文字または「特殊な」文字エンコーディングを処理しなければならない可能性がわずかに感じられたとしても、注意すべき点がいくつかありますが、文字列の処理を終了することを強くお勧めします。実際、コードとビルトインの間のテスト/注入可能性のために、間をシムしたり、シームとして機能したりできる間接的な薄いレイヤーを導入すると、作業が楽になります。厳密には必要ではありませんが、先見の明がない限り、国際化やそのような大規模な分野横断的なプロジェクトに取り組むのは困難です。

オートロードして、学び、愛してください。ハードコーディングされたrequire/includes、またはさらに悪いことに、それらの *_once バリアントから逃げて、インジェクションに関して手を縛り、代わりにオートローダーを使用します。最も簡単なことは、すべてのインクルードを配列に詰め込み、クラス名をキーにして、値はルートからのファイルパスで、高速です。これの悪い点は、クラスローダーを実装しているので、テストが非常に簡単になり、それを使って本当に素晴らしいことを実行できることです。

PHP 5.3 には名前空間があり、喜んでジャンプし、狂人のように使用してください。これだけでも、テスト/注入用の継ぎ目 (まれ) を作成する機会が提供されます。

オペコード キャッシュ、ファイル アクセスは遅いです。これを回避するには、オペコード キャッシュを使用します。これはファイル アクセスだけではなく、実際にはすべての解析です。PER リクエストを解析する必要がない場合、大きな違いが生じます。フロントコントローラー/インターセプターに対してこれを行うことでも、多くの利点が得られます。

Java/.Net 出身の PHP プログラマーにとって最も厄介なことの 1 つは、アプリケーション サーバーが PHP/Apache または使用している Web サーバーに分散していることです。

Phing/Ant/PHPMaven の初期段階では、すべてを詰め込むだけで簡単に思えますが、ビルド スクリプトは php で依然として有用であり、優れたサポートがいくつかあります。

メソッドのオーバーロードに問題がありましたが、まだそれと戦っています。その特定の側面を緩和するためのパターンを思いつきました。私はしばしば特定のパラメータを満たすことができる多くのものを持っていたので、 @param mixed(int|array|fooObject) それらが可能である場合、それを文書化するとき、Caster::CastTo($param, $toTypeAsString) という静的メソッドを作成しましたタイプに一致するケースを実行し、それを既知のタイプに変換しようとします。メソッドの残りの部分は、その 1 つの型、または変換の失敗を想定して、それを処理することができます。また、すべての変換を 1 つのクラスにまとめたので、型のマッピングが分野横断的な問題になることはなくなりました。また、これらの関数は個別にテストできるため、一度テストすれば、他のすべての場所でそれらに依存することができました。

于 2009-08-18T17:29:51.990 に答える
4

メソッドが期待するパラメーターの型を暗黙的に指定する

実際、これは部分的に可能です (少なくとも PHP5 では)。配列の型と関数とメソッドのオブジェクト パラメーターを指定できますが、スカラー型の場合はうまくいきません。

class Bar
{
    public function __construct(array $Parameters, Bar $AnotherBar){}
}

これとAllainが言及した魔法のメソッドとは別に、SPL(標準PHPライブラリ)によって提供されるインターフェースも不可欠だと思います-クラスに必要なメソッドを実装できます。たとえば、ArrayAccessおよびIteratorインターフェースが特に好きです。連想配列のようなオブジェクトを使用するか、単純な配列のように反復します。

于 2008-09-15T13:05:16.693 に答える
4

標準 PHP ライブラリには多くの宝石が隠されています。配列アクセスを使用すると、配列インターフェイスに対して機能するオブジェクトを構築できますが、独自の機能を追加できます。

また、コンストラクターでフラグを設定して ArrayAccess オブジェクトを作成すると、オブジェクトを配列またはオブジェクトとして読み書きできます。次に例を示します。

$obj = new ArrayObject(array("name"=>"bob", "email"=>"bob@example.com"),2);
$obj->fullname = "Bob Example";
echo $obj["fullname"];
$obj["fullname"]="Bobby Example";
echo $obj->fullname;
于 2009-06-22T21:53:45.213 に答える
4

「」と「」の違いも好きです。

$foo = 'Bob';
echo 'My name is {$foo}'; // Doesn't swap the variable
echo "My name is {$foo}"; // Swaps the variable

したがって、文字列に変数のスワッピングが必要ない場合は、" を使用しないでください。時間の無駄です。多くの人が文字列を常に " で宣言しています。

注: { } を使用すると、変数がより目立ちます。

于 2009-06-22T19:57:21.720 に答える
3

私は Python に切り替え始めましたが、Python で気に入ったことの 1 つは、ライブ インタープリターです。後でphpプロジェクトに取り組むまで、phpにこのオプションがあることに気づきませんでした.それは広く知られていません. コマンド プロンプトで、php -aテストする任意の php コードを入力して貼り付けます。<?php

于 2009-07-23T18:21:11.913 に答える
3

GOTO機能に対する彼らの適切な敬意が鍵だと思います。

http://us2.php.net/goto

于 2010-01-09T05:34:06.440 に答える
3

まあ、コミュニティは私にとってそもそもです。あなたの問題が何であれ、あなたはいつもそれを以前に持っていた人を見つけ、ほとんどの場合解決策を見つけます...そして時々私はアイデアの完全に無料の共有、単一の問題へのアプローチ方法を見てきました.

私は今、Python を学ぼうとしています (成長するために... そうですね.. プログラマーですか?) そして、Python の最も便利な点はインデントです。PHP のインデント、変数に署名するための $ マーク、ループと循環のための中括弧、これらのスマートな機能のおかげで、私のコードは非常に理解しやすくなっています (コードを書いた人が少し面倒だったとしても)。 「スパゲッティ・コード」、ん?)

PHP の配列は、非常にシンプルで強力です。

データベース: MySQL、Postrgee、SQL; ほぼすべての種類のデータベースを簡単に使用できます。

クイック: 論理的にはコードの記述方法によって異なりますが、通常、PHP は小規模/中規模のアプリケーションではかなり高速です(大規模なアプリケーションでは無駄になるため)。

于 2009-03-20T16:36:54.417 に答える
2

ラムダ関数

例-多次元配列のフィールドで並べ替え

function sort_by_field($field, & $data) {
    $sort_func = create_function('$a,$b', 'if ($a["' . $field . '"] == $b["' . $field . '"]) {return 0;} 
            return ($a["' . $field . '"] < $b["' . $field . '"]) ? -1 : 1;');

    uasort($data, $sort_func);
}

匿名関数

匿名関数を使用すると、変数に関数を定義できます。 http://www.php.net/manual/en/functions.anonymous.php

于 2010-06-28T21:00:08.370 に答える
2

事前定義されたインターフェイス:

http://php.net/manual/en/reserved.interfaces.php

たとえば、実装ArrayAccessすると、オブジェクトが配列として表示されるかIterator、foreachステートメントで使用できるようになります。

残念ながら、配列をパラメータとして受け取るネイティブ関数で「オブジェクト配列」を使用することはできません。

__callまた、オブジェクトのプロパティとメソッドを動的に作成できる関数をオーバーライドすると便利であることがわかりました。

私のデータベース抽象化では、これを使用して、データベースの列名で名前が付けられた関数を生成します。たとえば、列'name'がある場合は、を使用してその列の値を変更できますupdateByName("foo")

于 2010-01-09T06:23:23.410 に答える
2

どれどれ...

  1. 三項演算子。それらは、フォーム結果のチェックボックスを処理するために驚異的に機能します。

    $var = ($_POST['my_checkbox']=='checked') ? 真/偽;

  2. すべてのすばらしい文字列および配列処理関数は、調査する価値があります。strtotime()、strlen()、および strpos() は、私のお気に入りのいくつかです。

  3. SimpleXML クラスと json_decode() 関数。file_get_contents() を使用して REST API または RSS フィードを呼び出し、これらのツールのいずれかを使用して簡単に解析すれば完了です。

于 2009-06-21T20:57:56.247 に答える
2

PHP 関連の例、アプリケーション、クラス、ドキュメント、フレームワークなどを見つけるのは非常に簡単です...

ウェブ全体で、(自分で) コマンドを実行するときに最も簡単に習得できる言語であり、時間の価値が高い言語でもあります。

PHP を学んだ後は、CMS を joomla で、ブログを wordpress で、などを配置するかもしれません。

于 2008-09-15T18:21:22.207 に答える
1

PHP5.3では、PHARアーカイブをPHARアーカイブ内に配置できます。Javaの世界のWAR/EJBのように。

于 2009-08-28T20:17:25.083 に答える
1

間違いなく魔法とオーバーロードのメソッド。Allainは__get()、__ set()、__ call()、__ toString()を引用しましたが、私は__wakeup()と__sleep()も大好きです。

この魔法のメソッドは、オブジェクトがシリアル化(スリープ)および逆シリアル化(ウェイクアップ)されるときに呼び出されます。この機能により、アプリケーションで使用しているシリアル化可能なデータベースラッパーなどを作成できます。

Class Connection {
   private $dsn;
   private $connection;
   ...
   public __wakeup() {
      $this->connection = ADONewConnection();
   }
}

このようにして、$_SESSIONなどで接続を「保存」できます。

于 2009-06-22T14:39:59.133 に答える
1

スタッカブルユニットファイル

<?
// file unit1.php
$this_code='does something.';
?>

<?
// file unit2.php
$this_code='does something else. it could be a PHP class object!';
?>

<?
// file unit3.php
$this_code='does something else. it could be your master include file';
require_once('unit2.php');
include('unit1.php');
?>

<?
// file main.php
include('unit1.php');
require_once('unit2.php');
require_once('unit3.php');
?>

動作が異なるため、意図的にincludeとrequire_onceを同じ意味で使用して、何ができるかを示しました。

コードを作成したり、コードにファイルを追加したりするには、複数の方法があります。HTML、AJAX、CSS、JAVASCRIPT、IMAGES、およびあらゆる種類のファイルをコードに動的にリンクすることも可能です。

インクルード/リクワイアを最初、中間、または最後に配置する必要もないため、特に気に入っています。これにより、用途に応じて、より多くの自由が可能になります。

于 2010-01-29T11:02:34.503 に答える
1

これについてはすでに多くの人が述べています。

隠されていなくても、かなり忘れられているように見えることを1つ追加するだけで、 http://www.php.netのhttp://talks.php.net部分です。非常に古いものもあれば、新しくて非常に価値のあるものもあり、多くの有用なプレゼンテーションが集められています。

于 2010-01-07T17:42:32.287 に答える
1

長年にわたる私の啓示は、言語ベースというよりも概念的なものでした。

1: エコーの代わりにレンダリングします。

function render_title($title){
     return "<title>$title</title";
}

エコーを使用する代わりに、出力をレンダリングするときにパーツを繰り返し使用してテンプレートに渡す方がはるかに簡単です (この場合、出力バッファリングに依存する必要があります)。

2: 関数型プログラミング、または少なくともそれに近づくことができる限り、副作用なしで機能します。グローバルを使用せずにレンダリングし、関数をローカルスコープに保つなど。しばらくの間、オブジェクト指向プログラミングが php を使用する方法であると考えていましたが、php でオブジェクト指向メソッドから関数型プログラミング メソッドにドロップダウンすることで経験したオーバーヘッドと構文の複雑さの削減により、関数型プログラミングが私にとって明確な選択になりました。 .

3: テンプレート システム (例: smarty)。すでにテンプレート スクリプト言語であるものの内部にテンプレート システムが必要であることに気付くのに長い時間がかかりましたが、それが提供する表示からのロジックの分離は非常に必要です。

于 2009-09-12T23:32:42.580 に答える
1

良い:

  • WebHosting における PHP の幅広い受容。ほぼすべての Web ホスティング サービスが PHP をサポートしています。
  • 簡単なことは簡単なコードで解決できます。クラスや名前空間は厳密には必要ありません。

悪い:

  • 命名規則のない関数がたくさんあります。これらすべての機能を効果的に使用するために覚えるのは非常に困難です。
  • ウェブ全体の悪いコーディング習慣 :(
于 2008-09-15T12:54:35.707 に答える
1

php の json_encode/decode 関数は非常に便利ですが、それほど隠れているわけではありません。

于 2009-06-22T14:54:24.300 に答える
0

元の投稿に関する質問: PHP でメソッドをオーバーロードするために switch ステートメントが必要なのはなぜですか? 「オーバーロード」という用語は、私が C++ から学んだことと一致しない何かを意味しているのかもしれません。

PHP の好きな機能としては、Exception オブジェクトが好きです。標準エラー コンテナーを使用すると、プレゼンテーション ロジックをビジネス ロジックから分離することがはるかに簡単になり、throw/catch 構文を使用すると、各クラスの自動テストを分離して作成することがはるかに簡単になります。

于 2010-01-25T23:05:00.223 に答える
0

別の優れた機能はcopy()です。この関数を使用すると、任意の場所からファイルを取得して (URL が機能する場合でも)、それをローカル リソースにコピーできます。そのため、ファイルの取得が非常に簡単になります。

于 2010-01-22T09:32:32.117 に答える
0

これは素晴らしい:

//file page_specific_funcs.inc

function doOtherThing(){

}

class MyClass{

}

//end file

//file.php

function doSomething(){
  include("page_specific_funcs.inc");

  $var = new MyClass(); 

}
//end of file.php

「page_specific_funcs.inc」ファイルは、doSomething が呼び出された場合にのみ含まれます。メソッド内のクラス、関数などの宣言は完全に機能します。

于 2009-06-22T01:07:27.570 に答える
0

魔法のメソッド__callStatic

このPDOシングルトンクラスのように、シングルトンを作るのに本当に便利です

于 2010-01-25T19:01:10.683 に答える
0

cURLを使用してテスト スイートをセットアップし、大規模で複雑な Web フォームとそのバックエンド アプリケーションを駆動します。テストは徹底的でした - 少なくとも許容可能な入力のすべての組み合わせを実行するという点で。

于 2010-02-23T20:39:30.643 に答える
-1

私が php で気に入っている隠れた機能: 1. 習得しやすい (また、誤用されやすい.. つまり、悪いプログラミングの習慣. $something = "1" と入力できるように; そして $something += 3 を実行した; そして突然 $something が整数になります .. Java のようなエラー メッセージやおかしな例外は発生しません)

  1. たくさんのライブラリ。phpclasses.org にアクセスすると、そこからほとんどすべてを入手できました。
  2. それを使用する多くのウェブ。好きか嫌いか..それが事実です!:)
  3. シンプルで小さく、メンテナンスが容易です。ポータブル デバイスに xampplite + vim (私のお気に入り) をインストールするだけです。
  4. 安いです !!!ビールと同じくらい安い...例:ホスティング。Java や .net ホストと比較して、php ホストは非常に安価で、いくつかの Web サイトから無料で入手できます (ただし、Web サイト内にいくつかのバナーや隠し要素が表示されます)。
  5. PHPのドキュメントはとても良かったです!! それが私が約6年間phpに固執している主な理由です(Groovy/Grailsを使用していくつかのプロジェクトを行いましたが)
于 2009-06-27T15:55:38.733 に答える
-2

switch ステートメントを使用すると、すべてのオプションにチェックを設定できます。これは例です。

$check = "HELLO";

switch ($check) {
       case (eregi('HI', $check)):
             echo "Write HI!";
       case (eregi('HELLO', $check)):
             echo "Write HELLO!";
       case (eregi('OTHER', $check)):
             echo "Write OTHER!";
}

さよなら...

于 2010-06-28T20:32:44.770 に答える
-4

上記のredwall_hpの最初の例で特に役立つブールキャスト。

それ以外の:

$var = ($_POST['my_checkbox']=='checked') ? TRUE : FALSE;

次のように入力できます。

$var = !!($_POST['my_checkbox']=='checked');
于 2009-06-22T05:51:07.807 に答える
-5

私の知る限り、関数呼び出しでパラメーターの型を暗黙的に指定できます。

function getInt(int $v)
{
     echo $v;
}

getInt(5); // will work
getInt('hello'); // will fail
于 2009-06-22T14:34:54.263 に答える