Hi,

This bug:

http://bugs.php.net/bug.php?id=46680

uncovers 2 larger issues.

1) Where should a function like file_put_contents() create its file if
it doesn't already exist and FILE_USE_INCLUDE_PATH is specified?  The
test for this is ext/standard/file/file_put_contents_variation4.phpt and
a few others.

file_put_contents($filename, "File in include path", FILE_USE_INCLUDE_PATH);

arbitrarily creates $filename in the first portion of include_path on
PHP 5.2, and arbitrarily creates $filename in cwd in PHP 5.3.  Of
course, if the file already exists in any of the include_path, both PHP
5.2 and 5.3 will overwrite it.

The same is true of fopen() in write mode.

2) Should file_get_contents()/fopen() in read mode fall back to current
directory if not found in include_path?  The test for this is
ext/standard/file/fopen_variation5.phpt and others

In PHP 5.2, the functions simply fail if the file does not exist in
include_path.  Thus if include_path does not contain ".", the file is
not found.  In PHP 5.3, there is a fallback to check cwd for the file.

For #1 I think both PHP 5.2 and 5.3 are broken.  If you specify that a
file should be written to inside include_path, it should fail if no file
is found - allowing arbitrary file creation is just plain stupid and
also dangerous - include_path has no business being used to create a
file, it should only be used to find existing files.  In any case, I
think allowing include_path to be used at all for file modification is
horrendous, and think it should be deprecated and removed from PHP 6. 
We should simply add file_resolve_path() function which can be used to
locate a file.

<?php
if ($path = file_resolve_path('somefile.txt')) {
    file_put_contents($path, 'blah');
} else {
    file_put_contents($someOtherPath, 'blah');
}
?>

For #2 I think PHP 5.3 is broken, and the fallback to cwd should be
removed from php_resolve_path.

Comments?

Greg

P.S. the tests themselves should not create directories outside of their
tests/ subdirectory, and should use things like PATH_SEPARATOR, but
that's a minor issue

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to