ننسى الربط الثابت المتأخر ، أحتاج إلى __file __file static متأخرًا
-
01-10-2019 - |
سؤال
أنا أبحث عن 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());