ننسى الربط الثابت المتأخر ، أحتاج إلى __file __file static متأخرًا

StackOverflow https://stackoverflow.com/questions/2718820

سؤال

أنا أبحث عن get_called_class() ما يعادل __FILE__ ... ربما شيء مثل get_included_file()?

لدي مجموعة من الفصول التي ترغب في معرفة الدليل الموجود فيه. شيء من هذا القبيل:

<?php

class A {

    protected $baseDir;

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

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

?>

وفي بعض الملفات الأخرى ، في مجلد آخر ...

<?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.

?>

الآن ، يمكنني أن أفعل شيئًا حي اليهود ، مثل الإضافة $this->baseDir = dirname(__FILE__) لكل فئة تمتد ، لكن هذا يبدو قليلاً ... الحي اليهودي. بعد كل شيء ، نحن نتحدث عن PHP 5.3 ، أليس كذلك؟ أليس من المفترض أن يكون هذا هو المستقبل؟

هل هناك طريقة أخرى للحصول على المسار إلى الملف حيث تم الإعلان عن الفصل؟

هل كانت مفيدة؟

المحلول

ماذا لو لم تستخدم __FILE__ لكن متغير منفصل وضبط المتغير إليه __FILE__ في كل فصل

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();

لا يزال يتعين عليك إعادة تجديد العقار في كل فصل ، ولكن ليس الطريقة

نصائح أخرى

هل حاولت تعيينه كعضو ثابت في الفصل؟

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

(لم يتم اختباره ، وتصبح الإحصائيات بالإضافة إلى ميراث الطبقة ممتعة للغاية ...)

يمكنك استخدام debug_backtrace (). ربما لا تريد ذلك.

تم اختباره:

    protected static $filename = __FILE__; 
    static::$filename 

لا يعمل.

يبدو أن الثابت مسجل عند تحميل الفصل وهو "متأخر".

لست متأكدًا من أنه كان ممكنًا من قبل ، ولكن الأفضل بالنسبة لي اليوم هو استخدام الانعكاس:

    $basePath = new \ReflectionObject($this);
    $dir = dirname($basePath->getFileName());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top