Bir değişken bir sınıfın tüm fonksiyonları var mı?

5 Cevap

Ben sitemde kod tekrarını azaltmak istiyorum, ve bunu yapmanın görebilirsiniz iyi yolu değişken ortamda gereksiz örneklerini bir çok kaldırmaktır - Ben küçük bir sorun var.

En yaygın bir kolaylık için http host ve php öz değerleri içeren $ baseURL değişken olduğunu. Ancak, her bir fonksiyon için onu ayarlamanız gerekiyor:

class Site
{
function outputPage()
{    
$baseUrl = "http://". $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
}
}

Bu, daha sonra, tipik olarak, site kullanan herhangi bir bağlantıları dahildir:

echo '<a href="' . $baseUrl .'/article/jun/example11/">Example 11</a>';

Bir zamanlar ihtiyacı işlev başına, sınıf genelinde yaklaşık altı kere ayarlanır - bu once ayarlamak için herhangi bir yolu yoktur ve sonra tüm fonksiyonları erişmesine izin?

5 Cevap

Sen bir sınıf değişkeni olarak ayarlayın ve yapıcı bunu başlatmak olabilir:

class Site {
    public function __construct() {
        $this->baseUrl = "http://". $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
        var_dump('constructor : ' . $this->baseUrl);
    }
    function outputPage() {    
        // use $this->baseUrl
        var_dump($this->baseUrl);
    }
    protected $baseUrl;
}

Ve sonra, sınıfını kullanırken:

$a = new Site();
$a->outputPage();

Alırsınız:

string 'constructor : http://tests/temp' (length=31)
string 'http://tests/temp' (length=17)


In some cases, you could also initialize "on the fly" when you're declaring it (on the line with protected, in my example).
But this doesn't work with everything ; you can't call a function there, for instance, if I remember correctly ; you can't concatenate strings either :

class Site {
    function outputPage() {    
        // use $this->baseUrl
        var_dump($this->baseUrl);
    }
    protected $baseUrl = "http://". $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
}

Bu hatası verecekti:

Parse error: syntax error, unexpected '.', expecting ',' or ';'

Ama bu:

class Site {
    function outputPage() {    
        // use $this->baseUrl
        var_dump($this->baseUrl);
    }
    protected $baseUrl = "http://www.google.com";
}

Çalışacak - ama o kadar güçlü değil, ve gerçekten istediğiniz ne olursa olsun bu şekilde yapamazsınız ...

Bir sınıfın yöntemleri o sınıfın üyeleri erişebilir.

class Site {

  private $baseurl;

  public function __construct()
  {
    $this->baseurl = "http://www.somesite.com";
  }

  public function hello()
  {
    print "My baseurl is " . $this->baseurl;
  }

}

$site = new Site;
$site->hello(); // My baseurl is http://www.somesite.com

sadece değişken bir sınıf üye oluşturmak :)

class Site {
  private $baseurl;
  public function __construct() {
    $this->baseurl = "http://". $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
  }
  public function outputPage() {    
    echo $this->baseurl;
  }
}

Ben sınıf sabitleri olarak bu tip şeyler tanımlamak için tercih.

class Settings
{
    const BASE_URL = "http://google.com";
}

Sonra require_once("settings.php"); her yerde kullanın ve Settings::Base_URL erişebilirsiniz

Ben bunun için sürekli kullanmak gerektiğini düşünüyorum:

define("BASE_URL", "http://".$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']), '/\\'));

Sonra kullanımı

echo '<a href="' . BASE_URL .'/article/jun/example11/">Example 11</a>';

Değer script çalışma zamanında asla değiştirmez çünkü sürekli kullanmak için uygun değildir. Ayrıca bunun için bir sınıf değişkeni ayarlayabilirsiniz. Hala her sınıfta çoğaltılamaz zorunda kalacağı.

class myClass{
    private $baseURL;
    function __construct()
    {
        $this->baseURL = http://".$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    }
    function speak()
    {
        echo $this->baseURL;
    }
}