باستخدام SPL_AUTOLOAD () غير قادر على تحميل الفصل

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

  •  02-10-2019
  •  | 
  •  

سؤال

أنا ألعب مع وظيفة SPL Autoload ويبدو أنها مفقودة شيئًا مهمًا لأنني غير قادر حاليًا على العمل. هنا هو المقتطف الذي أستخدمه حاليًا:

// ROOT_DIRECTORY translates to /home/someuser/public_html/subdomains/test
define('ROOT_DIRECTORY', realpath(dirname(__FILE__)));
define('INCLUDE_DIRECTORY', ROOT_DIRECTORY . '/includes/classes/');
set_include_path(get_include_path() . PATH_SEPARATOR . INCLUDE_DIRECTORY);
spl_autoload_extensions('.class.php, .interface.php, .abstract.php');
spl_autoload_register();

عندما echo get_include_path() أحصل على المسار الذي توقعته:

// Output echo get_include_path();
.:/usr/lib/php:/usr/local/lib/php:/home/someuser/public_html/subdomains/test/includes/classes/

ومع ذلك ، عندما أقوم بتشغيل الرمز ، أحصل على رسالة الخطأ هذه:

خطأ فادح: spl_autoload () [function.spl-autoload]: لا يمكن تحميل طلب الفصل في/home/someuser/public_html/subdomains/test/contact.php على السطر 5

request.class.php هو بالتااكيد في/home/someuser/public_html/sublains/test/include/classes/directory.

ماذا ينقصني؟

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

المحلول

هناك تعليق (مجهول) http://www.php.net/manual/en/function.spl-autoload-register.php#96804 قد ينطبق ذلك على مشكلتك: لا يبدو أن SPL_AUTOLOAD_REGISTER () يلعب بشكل جيد مع CAMELCASE ، وفي حالتك قد تحاول العثور على request.class.php بدلاً من الطلب ...

نصائح أخرى

يبدو أن المسار الذي من المفترض أن يكون فيه الفصل لا يتطابق مع المسار الذي كنت تتوقعه. قارن

.:/usr/lib/php:/usr/local/lib/php:/home/someuser/public_html/subdomains/test/includes/classes/

مع

/home/someuser/public_html/subdomains/test/

الفرق هو أن فصلك ليس موجودًا includes/classes/ كما يتطلب SPL الخاص بك ولكن بعض الدلائل أعلاه.

تلقيت رسالة خطأ مماثلة ولكن مشكلتي كانت مختلفة. تبدو رسالة الخطأ الخاصة بي على شكل

PHP Fatal error:  spl_autoload(): Class Lib\Lib\Regex could not be loaded in /dir1/dir2/lib/regex.php on line 49

اتضح أنني نسيت إزالة Lib\ من Lib\Regex داخل تعريف فئة Regex نفسه. كان لدي شيء مثل ما يلي:

namespace Lib;

class Regex {

...

   public static function match($pattern, $str) {

      $regex = new Lib\Regex($pattern);

      ...
   }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top