On 19 January 2015 at 05:48, Stanislav Malyshev <smalys...@gmail.com> wrote:

> Hi!
>
> > A constructor that fails is a hard failure (factory method failed to
> > produce the expected value), and is an exceptional case that can or
> cannot
> > be handled (via catch).
> > It's not just a failed operation (expected to eventually fail), but
> > something really went wrong, badly.
>
> Why it is different from any other failure? I.e. fopen("doesnotexist",
> "r") produces false and it's not "hard failure". But if files were
> objects, new File("doesnotexist", File::READONLY) suddenly becomes "hard
> failure"? How the latter is harder than the former? I would say it's
> exactly the same. If you say "new File" can only throw, you should also
> say fopen() should only throw. If fopen can return error value, so can
> File::open(), so can new File.
>

Excerpt from SplFileObject's manual page [1]:

    Throws a RuntimeException if the filename cannot be opened.

[1] http://php.net/splfileobject.construct


> The difference would be if File object would be built so that "new File"
> should never fail, and opening would be done with "$file->open()" and
> not with the ctor. But most of the object APIs in PHP are not written
> this way - for these APIs, ctor failure is not something exceptional
> more than failing to open file is exceptional.
>
> > Additionally, it makes no sense to have inconsistent behavior between
> > internal classes and userland classes: it is currently impossible for a
> > userland class to have the `new` operator producing an object that is not
> > an instance of the class after that operator.
>
> That can be changed if needed. This is just a missing feature.
>
> --
> Stas Malyshev
> smalys...@gmail.com
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>

Reply via email to