PHP'deki sınıf yöntemlerinin varsayılan görünürlüğü


118

Kılavuza baktım ama cevabı bulamıyorum.

Görünürlük bildirimi olmayan yöntemler için PHP'de varsayılan görünürlük nedir? PHP'nin Java'daki gibi bir paket görünürlüğü var mı?

Örneğin, aşağıdaki kodda, herkese go()açık mı yoksa özel mi?

class test {
  function go() {
  }
}

Sormamın nedeni, birçok kurucu kodunun şu şekilde function __construct()ve bazılarının olarak yazıldığını gördüm public function __construct(). Eşdeğerler mi?

Yanıtlar:



22

Varsayılan geneldir. Her zaman dahil etmek iyi bir uygulamadır, ancak erişim değiştiricileri olmayan PHP4 destekli sınıflar, bu nedenle bunların eski kodda kullanılmadığını görmek yaygındır.

Ve hayır, PHP'nin paket görünürlüğü yoktur, çünkü yakın zamana kadar PHP'nin hiç paketi yoktu.


16
@Ian: "açık örtük daha iyidir" Çünkü (ben söyleyebilirim pitonun Zen diyor). Diğer programcıların, kurucunun özel mi yoksa kamusal mı olduğunu merak ederek beyin döngülerini boşa harcamasına neden olur. İnsanlar her zaman erişim değiştiricileri kullandıysa, orijinal gönderen bu soruyu sormamış bile olabilir.
Kullanıcı

Ayrıca, Java gibi dillerde varsayılan paket-özeldi, biri tasarım gereği paket-özel mi diye merak ediyor veya geliştirici bunu belirtmeyi unutmuştu (özellikle kıdemli olmayan geliştiricilerle uğraşırken). PMD'nin
Johnco

9

Varsayılan, geneldir. Nedeni muhtemelen geriye dönük uyumluluktur, çünkü eski kod halka açık olmasını beklemektedir (halka açık olmasa çalışmayı durdurur).


Gerekçe için şeref.
Güney Özsan


1

Hiçbir zaman görünürlük anahtar kelime ( public, privateya protected) kullanılan yöntemler olacak kamu . Ancak özellikleri bu şekilde tanımlayamazsınız. için özellikleri , sen beyanı üzerine görünürlük anahtar kelime eklemek gerekir.

Sınıfta bildirilmeyen özellikler için ve bir yöntem içinde ona bir değer atadığınız için genel bir görünürlük olacaktır.

<?php
class Example {
    public $name; 
    public function __construct() {
        $this -> age = 9; // age is now public
        $this -> privateFunction();
    }
    private function privateFunction() {
        $this -> country = "USA"; // this is also public
    }
}

0

function __construct() ve public function __construct() aynı yöntem adıyla çalışır.

Bir yöntem adı için öneki tanımlayamadıysanız, varsayılan olarak genel olmalıdır.

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.