Geç statik bağlayıcı unut, ben __ FILE__ geç statik gerekir

4 Cevap php

Ben gibi __FILE__ ... Belki bir şey için get_called_class() eşdeğer arıyorum get_included_file()?

Ben bu gibi bir şey içeri var ne dizin bilmek istiyorum sınıfları bir dizi var:

<?php

class A {

    protected $baseDir;

    public function __construct() {
        $this->baseDir = dirname(__FILE__);
    }

    public function getBaseDir() {
        return $this->baseDir;
    }
}

?>

Ve diğer bazı dosyasında, diğer bazı klasörde ...

<?php

class B extends A {
    // ...
}

class C extends B {
    // ...
}

$a = new A;
echo $a->getBaseDir();

$b = new B;
echo $b->getBaseDir();

$c = new C;
echo $c->getBaseDir();

// Annnd... all three return the same base directory.

?>

Şimdi, $this->baseDir = dirname(__FILE__) her uzanan sınıfına ekleme gibi, bir şey getto yapabilirdi, ama bu biraz ... getto gibi görünüyor. Sonuçta, biz hemen, PHP 5.3 bahsediyoruz? Bu gelecekte olması gerekiyordu değil mi?

Bir sınıf ilan edildi dosyanın yolunu almak için başka bir yolu var mı?

4 Cevap

ne __FILE__ ama ayrı bir değişken kullanmak ve her sınıfta için __FILE__ değişkeni ayarlamak yoksa

class A {

    protected static $baseDir;
    protected $filename = __FILE__; // put this in every file

    public function __construct() {

    }

    public function getBaseDir() {
        return dirname($this->filename) . '<br>'; // use $filename instead of __FILE__
    }   

}

require('bdir/b.php');
require('cdir/c.php');

class B extends A {
    protected $filename = __FILE__; // put this in every file
}

$a = new A;
echo $a->getBaseDir();

$b = new B;
echo $b->getBaseDir();

$c = new C;
echo $c->getBaseDir();

Hala yöntemi, her sınıfta özelliği redeclare zorunda değil

Eğer sınıf statik bir üyesi olarak atama denediniz mi?

<?php
class Blah extends A {
    protected static $filename = __FILE__;
}

(Denenmemiş ve statik artı sınıf kalıtım çok eğlenceli olur ...)

Sen kullanabilirsiniz debug_backtrace(). Muhtemelen olsa, istemiyorum.