web-dev-qa-db-ja.com

PHPクラスメソッドの主要なアンダースコアとの取り決めは何ですか?

さまざまなPHPライブラリを見ていると、多くの人がクラスメソッドの前に単一のアンダースコアを付けることを選択していることに気づきました。

public function _foo()

...の代わりに...

public function foo()

最終的にこれは個人的な好みに帰着することを理解していますが、この習慣がどこから来たのかについて誰かが洞察を持っているかどうか疑問に思っていました。

私の考えでは、クラスメソッドが保護またはプライベートとしてマークされる前に、「PHP 4)しかし、それは多分それが私がよく知らないどこか(言語)に由来するか、または知ることから利益を得るためにその背後にある十分な推論があるかもしれないということにも思いつきました。

ご意見、ご意見、ご意見をいただければ幸いです。

148
nocash

Object Oriented PHP(PHP 4)の悪い昔からです。OOの実装はかなり悪く、プライベートメソッドのようなものは含まれていませんでした。これを補うために、PHP開発者はアンダースコアでプライベートにすることを意図したメソッドを前置きしました。一部の古いクラスでは、/**private*/ __foo() {が追加の重みを与えます。

開発者がすべてのメソッドにアンダースコアを付けていることを聞いたことがないので、その原因を説明することはできません。

147
Jeremy DeGroot

PHP現在のところ、これらの種類の規則の最も信頼できるソースは、Zend Frameworkがその一部であるため、 PSR-2:Coding Style Guide になると思います。 [〜#〜] psr [〜#〜]

保護された可視性またはプライベートな可視性を示すために、プロパティ名の前に単一の下線を付けてはいけません。

72
joedevon

さて、2013年、これはPSR-2コーディングガイドラインによる「公式に」悪いスタイルです

保護された可視性またはプライベートな可視性を示すために、プロパティ名の前に単一のアンダースコアを付けてはいけません(SHOULD NOT)

ソース: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md

40
Sliq

Private/protectedキーワードを使用でき、IDEでマークされます。

そして私はまだですが、それが良い習慣になる理由を見つけました。パブリックメソッドaddFoo()があり、そのメソッド内に他のメソッドaddFooWhenBar()addFooWhenBaz()...と共通するタスクの一部があると想像してください。その共通メソッドの名前はaddFoo()になりますが、すでに使用されているため、addFooInternal()またはaddFooCommon()または...などのlikeい名前を見つけなければなりません。ただし、_addFoo() privateメソッドは最適なメソッドのように見えます。

13
umpirsky

先頭のアンダースコアは一般にプライベートプロパティとメソッドに使用です。私が通常採用している手法ではありませんが、一部のプログラマーの間では人気があります。

12
jonstjohn

私はプライベートメソッドのために書いているPHP 5クラスで先頭のアンダースコアを使用します。特定のクラスメンバーがプライベートであるという開発者への小さな視覚的な手がかりです。 IDEを使用して、パブリックメンバーとプライベートメンバーを区別します。C#の時代から取り上げました。

9
GloryFish

あなたの元々の仮定は正しかったと思います。一部の言語では、アンダースコアを「オブジェクト」に対して非公開にするメソッド/メンバーなどの前に付けるのが一般的であることがわかりました。視覚的に言うことはできますが、これを呼び出すべきではありません!

5

私は同じ答えを探していて、いくつかの調査を行いましたが、PHPフレームワークが異なるスタイルを提案していることを発見しました:

コードイグナイター

公式マニュアルには この慣行を奨励するコーディングスタイルセクション があります。

プライベートメソッドと変数

パブリックメソッドがコードの抽象化に使用するユーティリティやヘルパー関数など、内部でのみアクセスされるメソッドと変数には、アンダースコアを前に付ける必要があります。

public function convert_text()

private function _convert_text()

他のフレームワークも同じように、例えば

Cakephp:

同じこと

メンバーの可視性

メソッドと変数にPHP5のプライベートキーワードと保護キーワードを使用します。さらに、非パブリックメソッドまたは変数名は単一のアンダースコア(_)で始まります。例:

class A
{
    protected $_iAmAProtectedVariable;

    protected function _iAmAProtectedMethod()
    {
       /* ... */
    }

    private $_iAmAPrivateVariable;

    private function _iAmAPrivateMethod()
    {
        /* ... */
    }
}

そしてまた

[〜#〜] pear [〜#〜]

同じこと

プライベートクラスのメンバーの前には、アンダースコアが1つ付きます。例えば:

$_status    _sort()     _initTree()

ながら

Drupal

特にコードスタイル これに対して警告

  1. 保護されたまたはプライベートのプロパティとメソッドでは、アンダースコアプレフィックスを使用しないでください。

シンフォニー

一方、 宣言

SymfonyはPSR-0、PSR-1、PSR-2、PSR-4ドキュメントで定義された標準に従います。

5
m.ardito

私はPythonからそれを知っています。あなたの変数にアンダースコアを付けると、コンパイラは実際の変数名の前の文字と数字のランダムなシーケンスを翻訳します。これは、クラスの外部から変数にアクセスしようとすると、「変数未定義」エラーが発生することを意味します。

これがまだPythonで使用する規則であるかどうかはわかりませんが、

4
Matthew

In Drupal(php CMS)アンダースコアを使用して、フックが呼び出されないようにすることができます( https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7 )。

「my_module」というモジュールがあり、関数にmy_module_insertという名前を付けたい場合、関数hook_insertを「フック」します。それを防ぐために、関数の名前を_my_module_insertに変更できます。

ps Drupalでのフックの動作方法は、誤ってフックを実装する可能性があり、これは非常に悪いことです。

3
maho

Drupal、およびアンダースコアの使用:

一般的に、アンダースコアは、関数がおそらく関連する親関数によってのみ呼び出されるという事実を単純にマークすることです...

function mymodule_tool($sting="page title"){
    $out ='';
    //do stuff 
    $out  .= _mymodule_tool_decor($sting);
    return $out;
}

function _mymodule_tool_decor($sting){
    return '<h1>'.$string.'</h1>';
}

もちろん、簡単な例です...

3
user3613677

クラスの外で「変数の変更」/「関数の呼び出し」を行わないという目的だけを思い出すためにアンダースコアを使用します。

Const変数をすべて大文字で宣言すると、変数の名前を見ながらそれがconst変数であると推測できます。クラスの外部で変更したくない変数と同様に、独自の規則のためにアンダースコアで宣言します。

0
Tassawer