Was ist mit einem führenden Unterstrich bei PHP-Klassenmethoden los?

155

Beim Durchsuchen verschiedener PHP-Bibliotheken ist mir aufgefallen, dass viele Leute einigen Klassenmethoden einen einzelnen Unterstrich voranstellen, z

public function _foo()

...anstatt...

public function foo()

Mir ist klar, dass dies letztendlich auf persönliche Vorlieben zurückzuführen ist, aber ich habe mich gefragt, ob jemand einen Einblick hat, woher diese Gewohnheit kommt.

Mein Gedanke ist, dass es wahrscheinlich von PHP 4 übernommen wird, bevor Klassenmethoden als geschützt oder privat markiert werden können, um zu implizieren, dass "diese Methode nicht von außerhalb der Klasse aufgerufen wird". Mir ist aber auch aufgefallen, dass es vielleicht irgendwoher kommt (eine Sprache), mit der ich nicht vertraut bin, oder dass es gute Gründe dafür gibt, dass ich davon profitieren würde, wenn ich es weiß.

Alle Gedanken, Einsichten und / oder Meinungen würden geschätzt.

kein Bargeld
quelle
9
Update 2014: Es ist offiziell veraltete Syntax: github.com/php-fig/fig-standards/blob/master/accepted/…
Sliq

Antworten:

155

Es ist aus den schlechten alten Zeiten von Object Oriented PHP (PHP 4). Diese Implementierung von OO war ziemlich schlecht und beinhaltete keine Dinge wie private Methoden. Um dies zu kompensieren, haben PHP-Entwickler Methoden, die privat sein sollten, einen Unterstrich vorangestellt. In einigen älteren Klassen werden Sie sehen /**private*/ __foo() {, dass es etwas mehr Gewicht gibt.

Ich habe noch nie von Entwicklern gehört, die all ihren Methoden Unterstriche voranstellen, daher kann ich nicht erklären, was das verursacht.

Jeremy DeGroot
quelle
12
Ich setze einen Unterstrich vor Methoden in meine Controller, die für die Klasse privat sind und beim Routing nicht verwendet werden. Da ich mit meinem eigenen Framework arbeite, erhöht dies die Sicherheit, da ich die Richtlinie erzwinge, dass Controller-Namen innerhalb von Routen keinen führenden Unterstrich enthalten. Dies überschreitet jedoch selten 1-2 Methoden pro Controller.
Robert K
6
Konventionell sind bei Perl Methoden, die mit einem Unterstrich beginnen, privat. Aber es ist nur eine Konvention. Tatsächlich sind diese Methoden immer noch von außerhalb der Klasse zugänglich.
Luc M
Unterstriche sind noch weniger sinnvoll, wenn eine erweiterte Klasse beschließt, die geschützte Methode ihres Elternteils öffentlich zu machen. Es ist ein Randfall, aber es passiert. API-Entwickler können auch eine private Methode als öffentlich verfügbar machen, was bedeutet, dass sie den Methodennamen zusätzlich zum Ändern des Zugriffsmodifikators umgestalten müssen. Kein Problem, aber dennoch ein Ärgernis.
Johan Fredrik Varen
Johan - Refactoring ist ein Ärgernis? Mein Editor verfügt über eine Funktion namens "Suchen und Ersetzen". Funktioniert super!
DaveWalley
Es ist eine C # -Konvention, mit der Sie privaten Mitgliedern genau einen Unterstrich voranstellen können. Daher war es eine Konvention von Zend Framework 1 (2012), dies auf die gleiche Weise zu tun.
Alpham8
73

Ich glaube, die derzeit maßgeblichste Quelle für diese Art von Konventionen für PHP ist der PSR-2: Coding Style Guide, da das Zend Framework Teil von PSR ist :

Eigenschaftsnamen sollten NICHT mit einem einzigen Unterstrich versehen werden, um geschützte oder private Sichtbarkeit anzuzeigen.

Joedevon
quelle
9
Die Verwendung einer Namenskonvention ist meines Erachtens kein Grund, eine Sprache zu lieben.
September
4
Als ich das erste Mal darüber las, verstand ich den Grund dafür, dass Sie sich eine Methode ansehen und wissen können, ob sie öffentlich oder privat ist. Was viel sinnvoller gewesen wäre, wenn es eher eine Anforderung als eine Konvention gewesen wäre. Denn wenn 1 Programmierer in einem Team einen Unterstrich hinzufügt, wenn er nicht benötigt wird, oder einen mit einem Unterstrich öffentlich macht, kommt es zu großer Verwirrung. Wie sich herausstellt, kam dies von PHP4, wie Jeremy betont, und # #FF stützte ihre Konvention auf die PEAR-Konvention. PEAR hat es entfernt und ich glaube, #ZF wird nachziehen.
Joedevon
Diese Antwort ist richtig. Es ist überall in Magento, und wie Sliq weiter unten bemerkt hat, ist es eine Konvention, die allgemein veraltet ist.
Siliconrockstar
Hier ist der aktualisierte Link dazu. Framework.zend.com/manual/1.12/en/…
Shapeshifter
FYI (und @joedevon) Zend 2.4 wurde vor einigen Monaten veröffentlicht und verwendet immer noch Unterstriche für private und geschützte Frameworks.zend.com/manual/current/en/ref/… .
James
40

Jetzt, im Jahr 2013, ist dies nach der PSR-2-Codierungsrichtlinie "offiziell" ein schlechter Stil :

Eigenschaftsnamen sollten NICHT mit einem einzigen Unterstrich versehen werden, um geschützte oder private Sichtbarkeit anzuzeigen. "

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

Sliq
quelle
6
laut PSR-2-> "SOLLTE NICHT" bedeutet "NICHT EMPFEHLEN" nicht verboten Das bedeutet in einigen Fällen akzeptabel. PSR Doc -> ietf.org/rfc/rfc2119.txt
ahmed hamdy
14

Ich war stark dagegen, privaten / geschützten Methoden einen Unterstrich voranzustellen, da Sie dafür das private / geschützte Schlüsselwort verwenden können und IDE es für Sie markiert.

Und ich bin es immer noch, aber ich habe einen Grund gefunden, warum es eine gute Praxis sein kann. Stellen Sie sich vor, Sie haben eine öffentliche Methode addFoo()und innerhalb dieser Methode haben Sie einen Teil der Aufgabe, der mit anderen Methoden gemeinsam ist addFooWhenBar(), addFooWhenBaz()... Nun, der beste Name für diese allgemeine Methode wäre addFoo(), aber er ist bereits vergeben, also müssen Sie sich einen einfallen lassen hässlicher Name wie addFooInternal()oder addFooCommon()oder ... aber _addFoo()private Methode sieht aus wie die beste.

Umpirsky
quelle
Ja, stimmte zu. Ich bin hierher gekommen, um zu sehen, was andere über Unterstriche denken, weil ich sie nur selten verwendet habe und es sich immer falsch anfühlt, aber dieses Beispiel habe ich einmal. Ich habe sie auch für einige Fälle des Vorlagenmethodenmusters verwendet, in denen eine öffentliche Methode abstrakte geschützte Methoden aufruft, die von Kindern überschrieben wurden, was eine ähnliche Idee ist. Manchmal sind eine öffentliche Methode und eine abstrakte geschützte Methode, die sie aufruft, so ähnlich oder verwandt, dass es seltsamer erscheint, sie anders zu benennen, als dem abstrakten ein _ voranzustellen.
John Pancoast
12

Führende Unterstriche werden in der Regel für private Immobilien und Methoden verwendet . Keine Technik, die ich normalerweise verwende, die aber bei einigen Programmierern beliebt bleibt.

Jonstjohn
quelle
10

Ich verwende einen führenden Unterstrich in der PHP 5-Klasse, die ich für private Methoden schreibe. Es ist ein kleiner visueller Hinweis für den Entwickler, dass ein bestimmtes Klassenmitglied privat ist. Diese Art von Hinweisen ist nicht so nützlich, wenn Sie eine IDE verwenden, die öffentliche und private Mitglieder für Sie unterscheidet. Ich habe es von meinen C # -Tagen abgeholt. Alte Gewohnheiten...

GloryFish
quelle
5

Ich glaube, Ihre ursprüngliche Annahme war richtig. Ich habe festgestellt, dass es in einigen Sprachen üblich ist, Methoden / Mitgliedern usw., die für das "Objekt" privat gehalten werden sollen, einen Unterstrich voranzustellen. Nur eine visuelle Art zu sagen, obwohl Sie können, sollten Sie dies nicht nennen!

Quintin Robinson
quelle
5

Ich habe nach der gleichen Antwort gesucht, einige Nachforschungen angestellt und gerade festgestellt, dass PHP-Frameworks unterschiedliche Stile vorschlagen:

Code Zünder

Das offizielle Handbuch enthält einen Abschnitt zum Codierungsstil, der diese Vorgehensweise fördert :

Private Methoden und Variablen

Methoden und Variablen, auf die nur intern zugegriffen wird, z. B. Dienstprogramm- und Hilfsfunktionen, die Ihre öffentlichen Methoden für die Codeabstraktion verwenden, sollte ein Unterstrich vorangestellt werden.

public function convert_text()

private function _convert_text()

Andere Frameworks machen dasselbe wie

Cakephp:

macht das gleiche :

Sichtbarkeit der Mitglieder

Verwenden Sie die privaten und geschützten Schlüsselwörter von PHP5 für Methoden und Variablen. Darüber hinaus beginnen nicht öffentliche Methoden- oder Variablennamen mit einem einzelnen Unterstrich (_). Beispiel:

class A
{
    protected $_iAmAProtectedVariable;

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

    private $_iAmAPrivateVariable;

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

Und auch

BIRNE

macht das gleiche :

Private Klassenmitglieder erhalten einen einzelnen Unterstrich. Beispielsweise:

$_status    _sort()     _initTree()

Während

Drupal

Der Codestil warnt ausdrücklich davor :

  1. Geschützte oder private Eigenschaften und Methoden sollten kein Unterstrichpräfix verwenden.

Symphonie

auf der anderen Seite erklärt :

Symfony folgt den in den Dokumenten PSR-0, PSR-1, PSR-2 und PSR-4 definierten Standards.

m.ardito
quelle
Sehr gründliche Antwort.
Colonelclick
4

Ich kenne es aus Python, wo das Präfixieren Ihrer Variablen mit einem Unterstrich den Compiler veranlasst, eine zufällige Folge von Buchstaben und Zahlen vor dem tatsächlichen Variablennamen zu übersetzen. Dies bedeutet, dass jeder Versuch, von außerhalb der Klasse auf die Variable zuzugreifen, zu einem Fehler "Variable undefined" führen würde.

Ich weiß jedoch nicht, ob dies immer noch die Konvention ist, die in Python verwendet werden soll

Matthew
quelle
3

In Drupal (ein PHP-CMS) können Unterstriche verwendet werden, um zu verhindern, dass Hooks aufgerufen werden ( https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7 ).

Wenn ich ein Modul namens "my_module" habe und eine Funktion my_module_insert benennen möchte, würde es die Funktion hook_insert "einhaken". Um dies zu verhindern, kann ich meine Funktion in _my_module_insert umbenennen.

ps Die Art und Weise, wie Hooks in Drupal funktionieren, ist es möglich, versehentlich einen Hook zu implementieren, was sehr schlecht ist.

Maho
quelle
1
Ich habe das für einige Zeit als Designfehler von Drupal angesehen. Es wäre sinnvoller, Ihre Haken explizit zu registrieren, um Verwirrung und fehlerhaften Betrieb zu vermeiden. Annahme ist im Allgemeinen eine schlechte Sache, und Konstrukte, die die normale Programmierung stören oder sie entführen, sind normalerweise eine schlechte Architektur.
Mopsyd
3

Drupal und Unterstrich:

Im Allgemeinen besteht der Unterstrich darin, einfach die Tatsache zu markieren, dass eine Funktion wahrscheinlich nur von einer verwandten übergeordneten Funktion aufgerufen wird ...

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

Natürlich nur ein einfaches Beispiel ...

user3613677
quelle
0

Verwenden Sie den Unterstrich nur, um sich daran zu erinnern, dass wir die Variable nicht außerhalb der Klasse ändern / die Funktion aufrufen.

Da wir const-Variablen in Großbuchstaben deklarieren, können wir beim Anzeigen des Variablennamens vermuten, dass es sich um eine const-Variable handelt. Ähnlich wie die Variable, die wir außerhalb der Klasse nicht ändern möchten, deklarieren wir sie mit einem Unterstrich für unsere eigene Konvention.

Tassawer
quelle
Was meinst du mit "const Variablen"? Wie können Sie eine Konstante definieren, die variabel ist?
Nico Haase
-21

Sie werden "magische Methoden" genannt .

Tristan
quelle
39
_foo()mit einem einzigen führenden Unterstrich ist keine magische Methode. Magische Methoden werden durch zwei aufeinanderfolgende führende Unterstriche gekennzeichnet. Die Frage hier spricht nur von einer.
BoltClock