PHP sınıf yöntemlerinde önde gelen alt çizgi ile anlaşma nedir?


155

Çeşitli PHP kütüphanelerine bakarken, birçok insanın bazı sınıf yöntemlerini tek bir alt çizgiyle önek olarak seçtiğini fark ettim.

public function _foo()

...onun yerine...

public function foo()

Nihayetinde bunun kişisel tercihe bağlı olduğunu fark ettim, ama bu alışkanlığın nereden geldiğine dair bir fikrin olup olmadığını merak ediyordum.

Benim düşüncem, sınıf yöntemlerinin korumalı veya özel olarak işaretlenmesinden önce, muhtemelen "bu yöntemi sınıfın dışından çağırma" olarak ima etmenin bir yolu olarak PHP 4'ten taşındığıdır. Bununla birlikte, belki de aşina olmadığım bir yerden (bir dil) kaynaklandığı veya bilmemden faydalanacağım iyi bir akıl yürütmenin olabileceği aklıma geldi.

Herhangi bir düşünce, içgörü ve / veya görüş takdir edilecektir.


9
Güncelleme 2014: Resmi olarak modası geçmiş sözdizimi: github.com/php-fig/fig-standards/blob/master/accepted/…
Sliq

Yanıtlar:


155

Nesne Tabanlı PHP'nin kötü eski günlerinden (PHP 4). OO'nun uygulanması oldukça kötüydü ve özel yöntemler gibi şeyleri içermiyordu. Telafi etmek için PHP geliştiricileri, alt çizgiyle özel olması amaçlanan yöntemleri önceden hazırladılar. Bazı eski sınıflarda biraz daha /**private*/ __foo() {fazla kilo vermeyi göreceksiniz .

Tüm yöntemlerini alt çizgi ile hazırlayan geliştiricilerin hiç duymadım, bu yüzden bunun nedenini açıklamaya başlayamıyorum.


12
Sınıflarıma özel olan ve yönlendirmede kullanılmayan denetleyicilerime yöntemlerden önce bir alt çizgi yerleştiriyorum. Kendi çerçevemle çalıştığım için, yollardaki denetleyici adlarında önde gelen alt çizgi olmaması ilkesini uyguladığım için güvenlik ekleniyor. Ancak bu, denetleyici başına nadiren 1-2 yöntemi aşıyor.
Robert K

6
Geleneksel olarak, perl ile alt çizgiyle başlayan yöntem özeldir. Ama bu sadece bir kongre. Aslında, bu yöntemlere hala sınıfın dışından erişilebilir.
Luc M

Genişleyen bir sınıf, ebeveyninin korunan yöntemini herkese açık hale getirmeye karar verirse, alt çizgiler daha da anlamlı olur. Bu bir uç durum, ama oluyor. API geliştiricileri ayrıca özel bir yöntemi herkese açık olarak göstermeyi seçebilir, yani erişim değiştiriciyi değiştirmenin yanı sıra yöntem adını yeniden düzenlemek zorunda kalacaklardır. Biggie yok, ama yine de bir sıkıntı.
Johan Fredrik Varen

Johan - Yeniden düzenleme bir sıkıntı mı? Düzenleyicimin "Bul ve Değiştir" adlı bir özelliği var. Harika çalışıyor!
DaveWalley

Özel üyelere tam olarak bir alt çizgi eklemek için kullanabileceğiniz bir C # kuralıdır. Bu nedenle, bunu aynı şekilde yapmak bir Zend Framework 1 (2012) sözleşmesiydi.
alpham8

73

Ben şu anda PHP için bu tür sözleşmeler için en yetkili kaynak PSR-2: Kodlama Stil Kılavuzu olacağını düşünüyorum çünkü Zend Framework PSR bir parçasıdır :

Mülk adlarına, korumalı veya özel görünürlüğü göstermek için tek bir alt çizgi eklenmemelidir.


9
Bir adlandırma kuralı kullanmak bir dili sevmek için bir neden değildir.
Eylül

4
Bunu ilk okuduğumda, bir yönteme bakıp bunun genel ya da özel olup olmadığını bilmeniz için sebebini anladım. Bu bir sözleşmeden çok bir gereklilik olsaydı çok daha mantıklı olurdu. Çünkü bir takımdaki 1 programcı gereksiz yere bir alt çizgi eklerse veya bir alt çizgiyle herkese açık bir alt çizgi eklerse, çok fazla karışıklık yaşarsınız. Anlaşıldığı üzere, Jeremy'in işaret ettiği gibi PHP4'ten geldi ve & #ZF, sözleşmelerini PEAR konvansiyonuna dayandırdı. PEAR onu kaldırdı ve #ZF'nin davayı takip edeceğine inanıyorum.
joedevon

Bu cevap doğrudur. Magento'daki her yerde ve aşağıda Sliq tarafından belirtildiği gibi, genellikle onaylanmamış bir sözleşmedir.
siliconrockstar

İşte bununla ilgili güncellenmiş bağlantı. framework.zend.com/manual/1.12/en/…
Shapeshifter

FYI (ve @joedevon) Zend 2.4 birkaç ay önce yayınlandı ve yine de özel ve korumalı çerçeve için alt çizgi kullanıyorlar. Zend.com/manual/current/en/ref/… .
James

40

Şimdi, 2013 yılında, bu PSR-2 kodlama kılavuzu tarafından "resmi olarak" kötü tarzı :

Mülk adlarına, korumalı veya özel görünürlüğü göstermek için tek bir alt çizgi eklenmemelidir`

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


6
göre PSR-2-> "DEĞİLMELİDİR" anlamına gelir "TAVSİYE ETMEYİN" yasak değil Bu, bazı durumlarda kabul edilebilir olabilir. PSR Doc -> ietf.org/rfc/rfc2119.txt
ahmed hamdy

14

Bunun için özel / korumalı anahtar kelime kullanabildiğiniz ve IDE sizin için işaretleyeceğinden özel / korumalı yöntemlerin alt çizgi ile öneklenmesine şiddetle karşıydım.

Ve hala öyleyim, ama bunun iyi bir uygulama olabilmesinin bir nedenini buldum. Genel yönteminiz olduğunu addFoo()ve bu yöntem içinde diğer yöntemlerle ortak olan bazı görevlerinizin olduğunu hayal edin addFooWhenBar(), addFooWhenBaz()... Şimdi, bu ortak yöntem için en iyi isim olurdu addFoo(), ancak zaten alınmış, bu yüzden bazı çirkin isim gibi addFooInternal()veya addFooCommon()veya ... ama _addFoo()özel yöntem en iyi gibi görünüyor.


Evet, kabul ettim. Aslında buraya başkalarının alt çizgiler hakkında ne düşündüğünü görmek için geldim çünkü onları nadiren kullandım ve her zaman yanlış geliyor, ama bu örnek bir kez var. Onları ayrıca, genel bir yöntemin çocukların geçersiz kılındığı soyut korumalı yöntemleri çağırdığı şablon yöntemi modelinin bazı durumlarda da kullandım, bu da benzer bir fikir. Bazen genel bir yöntem ve çağırdığı soyut korumalı bir yöntem o kadar benzer veya ilişkilidir ki, onları farklı şekilde adlandırmak, soyut olana _'in önekini eklemekten daha tuhaf görünür.
John Pancoast

12

Öncü alt çizgiler genellikle özel mülkler ve yöntemler için kullanılır . Genellikle kullandığım bir teknik değil, ancak bazı programcılar arasında popülerliğini koruyor.


10

Özel yöntemler için yazdığım PHP 5 sınıfında önde gelen bir alt çizgi kullanıyorum. Belirli bir sınıf üyesinin özel olması geliştiriciye küçük bir görsel işarettir. Bu tür ipuçları, herkese açık ve özel üyeleri sizin için ayıran bir IDE kullanılırken yararlı değildir. C # günlerimden aldım. Eski alışkanlıklar...


5

Ben orijinal varsayım doğru olduğuna inanıyorum, ben bazı diller için "nesne" özel tutulması amaçlanmıştır yöntemleri / üyeler vb bir alt çizgi önek için ortak uygulama olarak bulduk. Yapabilmenize rağmen görsel bir yol, bunu çağırmamalısınız!


5

Aynı cevabı arıyordum, biraz araştırma yaptım ve sadece php çerçevelerinin farklı stiller önerdiğini keşfettim:

Kod Ateşleyici

Resmi kılavuzda bu uygulamayı teşvik eden bir kodlama stili bölümü vardır :

Özel Yöntemler ve Değişkenler

Genel yöntemlerinizin kod soyutlaması için kullandığı yardımcı program ve yardımcı işlevler gibi yalnızca dahili olarak erişilen yöntem ve değişkenlerin önüne bir alt çizgi eklenmelidir.

public function convert_text()

private function _convert_text()

Diğer çerçeveler aynısını yapar,

Cakephp:

aynısını yapar :

Üye Görünürlüğü

Yöntemler ve değişkenler için PHP5'in özel ve korumalı anahtar kelimelerini kullanın. Ayrıca, genel olmayan yöntem veya değişken adları tek bir alt çizgi (_) ile başlar. Misal:

class A
{
    protected $_iAmAProtectedVariable;

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

    private $_iAmAPrivateVariable;

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

Ve ayrıca

ARMUT

aynısını yapar :

Özel sınıf üyelerinden önce tek bir alt çizgi bulunur. Örneğin:

$_status    _sort()     _initTree()

Süre

Drupal

kod stili özellikle buna karşı uyarır :

  1. Korumalı veya özel mülkler ve yöntemler alt çizgi öneki kullanmamalıdır.

Senfoni

Öte yandan, beyan eder :

Symfony, PSR-0, PSR-1, PSR-2 ve PSR-4 belgelerinde tanımlanan standartları takip eder.


Çok kapsamlı bir cevap.
colonelclick

4

Ben bir alt çizgi ile değişkenleri önek derleyici gerçek değişken adının önünde bazı rastgele harf ve sayı dizisi çevirmek neden olur python biliyorum. Bu, değişkenin sınıf dışından erişilmesine yönelik herhangi bir girişimin "değişken tanımsız" hatasına yol açacağı anlamına gelir.

Yine de, bu hala python kullanmak için kongre olup olmadığını bilmiyorum


3

Drupal'da (php CMS) kancaların çağrılmasını önlemek için alt çizgiler kullanılabilir ( https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7 ).

"My_module" adlı bir modülüm varsa ve my_module_insert işlevini adlandırmak istiyorsanız, hook_insert işlevinde "hook" olurdu. Bunu önlemek için işlevimi _my_module_insert olarak yeniden adlandırabilirim.

ps Kancaların Drupal'da çalışması, yanlışlıkla bir kanca uygulamak mümkündür, ki bu çok kötüdür.


1
Bir süredir drupal'ın tasarım kusuru olduğunu düşündüm. Karışıklığı ve düzensiz çalışmayı önlemek için kancalarınızı açıkça kaydetmek daha mantıklı olacaktır. Varsayım genellikle kötü bir şeydir ve normal programlamaya müdahale eden veya bunları ele geçiren yapılar genellikle zayıf mimaridir.
mopsyd

3

Drupal ve alt çizgi kullanma:

Genel bir şekilde alt çizgi, bir işlevin muhtemelen yalnızca ilgili bir üst işlev tarafından çağrılması gerçeğini basitçe işaretlemektir ...

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

Elbette, basit bir örnek ...


0

Alt çizgiyi sadece hatırlamak amacıyla sınıf dışında 'değişkeni değiştirmeyeceğiz' / 'işlevi çağırmayacağız'.

Const değişkenlerini tüm büyük harflerle bildirirken değişkenin ismini görürken bir const değişkeni olduğunu tahmin edebiliriz. Sınıf dışında değiştirmek istemediğimiz değişkene benzer şekilde, kendi sözleşmemiz için alt çizgiyle bildiririz.


"Sabit değişkenler" ile ne demek istiyorsun? Değişken olan bir sabiti nasıl tanımlayabilirsiniz?
Nico Haase

-21

Bunlara "sihirli yöntemler" denir .


39
_foo()tek bir alt çizgiyle sihirli bir yöntem değildir. Sihirli yöntemler birbirini takip eden iki alt çizgi ile gösterilir . Buradaki soru sadece birinden bahsediyor.
BoltClock
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.