Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.php > #14554

Re: OO PHP result of new if a constructor fails

From Thomas 'PointedEars' Lahn <PointedEars@web.de>
Newsgroups comp.lang.php
Subject Re: OO PHP result of new if a constructor fails
Date 2014-11-13 04:09 +0100
Organization PointedEars Software (PES)
Message-ID <2482034.fQki01Cq4G@PointedEars.de> (permalink)
References <m3t91i$rp6$1@dont-email.me> <4146385.JyWBYEY6r6@PointedEars.de> <m3uevr$s4b$1@solani.org> <2544086.7FOxZRQfaF@PointedEars.de> <m40t74$pi6$1@solani.org>

Show all headers | View raw


Christoph M. Becker wrote:

> Thomas 'PointedEars' Lahn wrote:
>> Christoph M. Becker wrote:
>>> Thomas 'PointedEars' Lahn wrote:
>>>> James Harris wrote:
>>>>> I understand that PHP constructors cannot return anything
>>>> Doubtful.
>>> AIUI, a PHP constructor is the method __construct, […]
>> A common misconception (which was discussed during the ZCE PHP 5.4 Exam
>> Preparation Course because it is a common pitfall in the exam).
> 
> <snipped thorough explanation>
> 
> Thanks.  I am aware of that (unfortunately, I'm still having to cope
> with PHP 4 compatible code).  I attempted (and failed) to make the
> distinction between a function vs. an object-creation-expression[1]
> being called constructor, the latter obviously "returning" something.

This distinction is invalid as an /object-creation-expression/ is never 
referred to as a “constructor” in the first place, and there cannot be a 
(user-defined) constructor without a /function-definition/:

<https://github.com/php/php-langspec/blob/master/spec/14-classes.md#constructors>

BTW, I am not certain whether this specification should be considered 
authoritative:

<https://github.com/php/php-langspec/blob/master/LICENSE>,
but: <https://github.com/php/php-langspec/blob/master/README.md>
 
>> Since PHP 5.3.x at the latest, it is no longer possible to call
>> constructors statically except with parent::…() [1], as that results in
>> “Fatal error: Non-static method … cannot be called statically …” −
> 
> ACK.  However, you could call a constructor function dynamically, e.g.
> 
>   $this->__construct();

Yes, but that is a) a bit pointless as the instance had to be constructed 
first (so that $this refers to it) and b) rather careless because 
constructors are usually designed to call other methods for initialization, 
whereas this call could only be contained in an “other method”, potentially 
leading to infinite recursion.

>> Also, it would appear that when a method is called as a constructor (with
>> the “new” keyword; in the aforementioned PHP 5.6 version – may also be
>> different in previous versions), its return value is ignored even if it
>> is a reference to an object.  [Because of that, a constructor that can
>> also serve as a factory, as in ECMAScript, for example, appears to be
>> impossible in PHP.]
> 
> See <http://3v4l.org/IO1qB> for an example of the behavior of several
> PHP versions (they behave like your PHP 5.6.2-1).

Thanks, I will have a look at it later.

> AFAIK, the behavior of ECMAScript is rather uncommon, but quite useful
> (especially wrt. calling the constructor function without new), but can
> be simulated in PHP with static factory methods and (a) private
> constructor(s).

No.

> [1]
> <https://github.com/php/php-langspec/blob/master/spec/10-expressions.md#the-new-operator>
 
-- 
PointedEars
Zend Certified PHP Engineer
Twitter: @PointedEars2
Please do not Cc: me. / Bitte keine Kopien per E-Mail.

Back to comp.lang.php | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

OO PHP result of new if a constructor fails "James Harris" <james.harris.1@gmail.com> - 2014-11-11 15:13 +0000
  Re: OO PHP result of new if a constructor fails Jerry Stuckle <jstucklex@attglobal.net> - 2014-11-11 10:20 -0500
    Re: OO PHP result of new if a constructor fails "James Harris" <james.harris.1@gmail.com> - 2014-11-11 15:56 +0000
      Re: OO PHP result of new if a constructor fails Jerry Stuckle <jstucklex@attglobal.net> - 2014-11-11 11:03 -0500
        Re: OO PHP result of new if a constructor fails "James Harris" <james.harris.1@gmail.com> - 2014-11-11 16:27 +0000
          Re: OO PHP result of new if a constructor fails Matthew Carter <m@ahungry.com> - 2014-11-11 12:01 -0500
            Re: OO PHP result of new if a constructor fails Jerry Stuckle <jstucklex@attglobal.net> - 2014-11-11 12:56 -0500
          Re: OO PHP result of new if a constructor fails Jerry Stuckle <jstucklex@attglobal.net> - 2014-11-11 12:52 -0500
  Re: OO PHP result of new if a constructor fails "Christoph M. Becker" <cmbecker69@arcor.de> - 2014-11-11 18:12 +0100
  Re: OO PHP result of new if a constructor fails Richard Damon <Richard@Damon-Family.org> - 2014-11-11 13:03 -0500
  Re: OO PHP result of new if a constructor fails Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2014-11-11 23:54 +0100
    Re: OO PHP result of new if a constructor fails "Christoph M. Becker" <cmbecker69@arcor.de> - 2014-11-12 03:00 +0100
      Re: OO PHP result of new if a constructor fails Matthew Carter <m@ahungry.com> - 2014-11-11 22:25 -0500
        Re: OO PHP result of new if a constructor fails Jerry Stuckle <jstucklex@attglobal.net> - 2014-11-11 22:36 -0500
          Re: OO PHP result of new if a constructor fails Matthew Carter <m@ahungry.com> - 2014-11-12 01:30 -0500
            Re: OO PHP result of new if a constructor fails Jerry Stuckle <jstucklex@attglobal.net> - 2014-11-12 07:08 -0500
            Re: OO PHP result of new if a constructor fails "Christoph M. Becker" <cmbecker69@arcor.de> - 2014-11-12 13:30 +0100
              Re: OO PHP result of new if a constructor fails Denis McMahon <denismfmcmahon@gmail.com> - 2014-11-12 13:52 +0000
                Re: OO PHP result of new if a constructor fails "Christoph M. Becker" <cmbecker69@arcor.de> - 2014-11-13 00:46 +0100
                Re: OO PHP result of new if a constructor fails Jerry Stuckle <jstucklex@attglobal.net> - 2014-11-12 22:28 -0500
      Re: OO PHP result of new if a constructor fails Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2014-11-12 21:30 +0100
        Re: OO PHP result of new if a constructor fails "Christoph M. Becker" <cmbecker69@arcor.de> - 2014-11-13 01:15 +0100
          Re: OO PHP result of new if a constructor fails Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2014-11-13 04:09 +0100
            Re: OO PHP result of new if a constructor fails Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2014-11-13 07:42 +0000
            Re: OO PHP result of new if a constructor fails "Christoph M. Becker" <cmbecker69@arcor.de> - 2014-11-13 14:11 +0100
              Re: OO PHP result of new if a constructor fails Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2014-11-13 21:40 +0100
                Re: OO PHP result of new if a constructor fails "Christoph M. Becker" <cmbecker69@arcor.de> - 2014-11-14 13:49 +0100
                Re: OO PHP result of new if a constructor fails Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2014-11-14 23:25 +0100
          Re: OO PHP result of new if a constructor fails Jerry Stuckle <jstucklex@attglobal.net> - 2014-11-12 22:29 -0500
            Re: OO PHP result of new if a constructor fails Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2014-11-13 21:45 +0100
              Re: OO PHP result of new if a constructor fails Jerry Stuckle <jstucklex@attglobal.net> - 2014-11-13 15:56 -0500
                Re: OO PHP result of new if a constructor fails Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2014-11-13 22:09 +0100
                Re: OO PHP result of new if a constructor fails Jerry Stuckle <jstucklex@attglobal.net> - 2014-11-13 21:03 -0500
              Re: OO PHP result of new if a constructor fails "Christoph M. Becker" <cmbecker69@arcor.de> - 2014-11-13 22:47 +0100
                Re: OO PHP result of new if a constructor fails Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2014-11-13 22:59 +0100
                Re: OO PHP result of new if a constructor fails "Christoph M. Becker" <cmbecker69@arcor.de> - 2014-11-18 19:02 +0100

csiph-web