| 
        php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
  [2010-07-22 16:08 UTC] jinmoku at hotmail dot com
 Description:
------------
spl_autoload_register don't load namespaces file in phar
Test script:
---------------
---- BEGIN TEST CODE ----
$phar = new Phar('MyPhar.phar');
$index = <<<DOC
<?php
	spl_autoload_register();
DOC;
$contents = <<<DOC
<?php
	namespace Framework;
	
	class Test
	{
		public function __construct()
		{
			echo 'hi';
		}
	}
DOC;
$phar->addFromString('index.php', $index);
$phar->addFromString('Framework/Test.php', $contents);
require_once('MyPhar.phar');
$test = new Framework\Test();
---- END TEST CODE ----
but this follow code work :
require_once('MyPhar.phar');
require_once('Framework\Test.php');
$test = new Framework\Test();
Expected result:
----------------
hi
Actual result:
--------------
Fatal error: spl_autoload() [function.spl-autoload]: Class Framework\Test could not be loaded
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             
             | 
    |||||||||||||||||||||||||||||||||||||
            
                 
                Copyright © 2001-2025 The PHP GroupAll rights reserved.  | 
        Last updated: Tue Nov 04 03:00:01 2025 UTC | 
On OSX 10.6.4 output : ��???�??? Fatal error: Class 'Framework\Test' not found in /Library/WebServer/Documents/test/index.php on line 26 require_once('Framework\Test.php'); don't run : ��???? Warning: require_once(Framework\Test.php): failed to open stream: No such file or directory in /Library/WebServer/Documents/test/index.php on line 26 Fatal error: require_once(): Failed opening required 'Framework\Test.php' (include_path='.:/usr/lib/php') in /Library/WebServer/Documents/test/index.php on line 26 and phar is not in PATH include_path Windows XPHi, the spl_autoload() will try to find the 'framework/test.php', i.e. the lowercased name, so on *nix will fail because it's case-sensitive, and you are using $phar->addFromString('Framework/Test.php'...). You must to use $phar->addFromString('framework/test.php', ...); (the lowercased name to the spl_auload to find it)I try lowercase, but that doesn't work too, I make some tests with spl_autoload and it's work in lower and uppercase filename. Why in osx (i don't try with other *nix) the phar is not in the include_path ? it's work fine (always with the strange "��????") with this follow code : require_once('MyPhar.phar'); set_include_path('phar://' . realpath('MyPhar.phar') . PATH_SEPARATOR . get_include_path()); require_once 'Framework/Test.php'; $test = new Framework\Test(); see ya ;)I can't reproduce the weird chars... About this is work...: require_once('MyPhar.phar'); set_include_path('phar://' . realpath('MyPhar.phar') . PATH_SEPARATOR . get_include_path()); require_once 'Framework/Test.php'; It's because that in this case the require_once doesn't look into the file system at all, but into the phar structure, so it doesnt search for the lowercased one, as in the other sample code.What I am saying is: - Using require_once you might use (lowercase not required): $phar->addFromString('Framework/Test.php', $contents); require_once 'Framework/Test.php'; // the search is non-lowercased - Using spl_autoload() you must use (lowercase required): $phar->addFromString('framework/test.php', $contents); $test = new Framework\Test(); // spl_autoload() searchs for the lowercased namespace/classname.phpOk, I retry on XP and it's work, even if it isn't simple, a filename in project is not always in lowercase... Unfortunately it's doesn't work on osx, we see : set_include_path('phar://' . __FILE__ . PATH_SEPARATOR . get_include_path()); but after the require_once the phar path's gone, i'll check on other system and I come back ;)Only way to work : $phar->addFromString(strtolower('index.php'), $index); $phar->addFromString(strtolower('Framework/Test.php'), $contents); or maybe do it in internalAdd detect_unicode to off for OSX : ini_set('detect_unicode', false); I think all the files should be automatically put in lowercase.