|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #14538 dirname fix broke behaviour that it had since PHP 3
Submitted: 2001-12-15 18:41 UTC Modified: 2002-02-09 19:58 UTC
From: mlemos at acm dot org Assigned:
Status: Closed Package: Documentation problem
PHP Version: 4.1.0 OS: Any
Private report: No CVE-ID: None
 [2001-12-15 18:41 UTC] mlemos at acm dot org
I was trying to test PHP 4.1.0 in a production site that I have that is made of large code base and realized that dirname original behaviour was broken severely.

The site exists for more than 2 years and always relied on the behaviour that dirname("/index.php") would return "" as it has been since PHP 3.

The site has 4.0.0 and was never upgraded since because I have this policy of not installing minor versions to avoid spending a lot of time maintaining changes that are caused by bugs that may have been introduced.

I investigated and it seems that in PHP 4.0.3, Andi fixed dirname so that dirname("/index.php") now returns "/" instead of "" as before.

Although this should have been probably the original behaviour of the function, the fact is that it wasn't not even in PHP 3 days.

My site heavily relies on this feature to let scripts realize in which directory they are relatively to the server document root using dirname(GetEnv("SCRIPT_NAME")) . So, my site is seriously broken because I use this everywhere in the site.

I talked with Andi and he is not willing to restore the original behaviour because the fix was done more than 1 year ago.

So, I propose that some option be added to php.ini that lets developers restore the original behaviour so that their sites don't break because of this change.

I also would like to recommend PHP developers to take more care when making these changes that break the existing PHP code base of PHP users because many ISP are refusing to upgrade to more recent versions because it breaks their clients PHP code and they would be loosing business if they would upgrade to a newer version.

Please consider this proposal carefully to avoid being accused of unprofessionalism of not assuring backwards compatibility of PHP functions behaviour.


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2001-12-15 18:47 UTC]

This behavior is not going to change, and we're not going to introduce a new headache-causing INI option to toggle this behavior.

If you really can't fix the code, you can create my_dirname() that wraps around dirname, and returns "" if the result is "".  Then, all you have to do is a search&replace of dirname -> my_dirname.

You use this 'threat' of being accused in unprofessionalism a bit too often, in my humble opinion :)

 [2001-12-15 19:06 UTC] mlemos at acm dot org

As always I am trying to be constructive here.

I am trying to bring the attention to the fact that as in the past, many ISPs did not upgrade from old PHP versions because they have bad experiences of having their clients code broken in new PHP versions. In this case, an old PHP version is 4.0.0 which is the previous major version.

If you decide to not be sensitive to this point , I am afraid you will be leaving a lot of people annoyed and loosing business.

As to the eventual accusation of being unprofessional, I mean that I am afraid that it will be what other people will think about who made these backward incompatible changes.

Forget that I am the person reporting here. I am not relying on that you ever make a wise decision regarding this. I'll have to make my code work similarly to what you suggested because I am well aware of the problem, but I am afraid that most people isn't.

I was just trying to help you avoid any future problems of credibility and professionalism before other people that may arise from these backward incompatible incidents (I am afraid there are more issues than just dirname).

I am just trying to help here, I regret the fact that my report is just being discarded as if I never made it to help you release PHP with a more professional attitude. Anyway, I am used to this systematic "ignore Manuel Lemos" atitude of yours. So, do whatever you think is best for your business and keep not caring about me spending time to help you. :-(
 [2001-12-15 19:50 UTC]
Actually, you both (Zeev and Manuel) are demanding the same thing, in case you didn't recognize. You both want a high backwards compatibility, but whereas Manuel is proposing a switch in php.ini for every little thing, Zeev rather prefers to have this compatibility "out of the box" (i.e. every script should run with the same behaviour on every PHP installation - which isn't 100% possible, what he accepts). 

providing seperate switches for every little thing would extremely complexify PHP programming, as you have to take care of every additional switch in PHP, therefore I agree with Zeev. The best thing would be to never change a language behaviour, but sometimes it seems to be unavoidable.
 [2001-12-15 20:19 UTC] mlemos at acm dot org

I don't think you are realizing how serious this is!

dirname was added to PHP 3.0a3 which was released more than 4 years ago. Until a year ago it had a behaviour that Andi thought it was not correct, so he fixed it for PHP 4.0.3 eventually breaking the code of people that did not realize it then because they don't upgrade PHP on every minor release.

So, the point is that what he thought was just a fix, was rather a behaviour change but he really didn't realize it until I reported today.

I am not proposing a php.ini option. What I am saying is:

1) Admit that Andi did not make a wise decision then and so avoid any future decisions like this.

2) Decisions like this break end users code and prevents them from upgrading.

3) Everytime a developer faces a decision like this, always provide a backwards compatible solution to not cause harm to people code base and not hurt their applications or even their businesses.

I think PHP developers were wise enough to avoid backwards compatibily problems of registering global by having a php.ini switch. I don't see why that could be bad for dirname. I am not even saying that you should always add a php.ini switch, but at least is a solution that does not leave people out there in the cold.

 [2001-12-15 20:59 UTC]
Reclassifying as a documentation problem (and reopened).

Manuel did a good job tracking down when the behaviour of dirname() has changed and it won't hurt us putting this information into the documentation.
 [2002-02-09 19:58 UTC]
This bug has been fixed in CVS.
PHP Copyright © 2001-2018 The PHP Group
All rights reserved.
Last updated: Sun Nov 19 01:31:42 2017 UTC