Doc #81038 [Com]: Early binding limitations insufficiently documented

[email protected] ("schamberumarcelo at gmail dot com") Thu, 24 Nov 2022 05:17:52 +0000
Newsgroups php.doc.bugs
Message-ID <[email protected]>
Edit report at https://bugs.php.net/bug.php?id=81038&edit=1

 ID:                 81038
 Comment by:         schamberumarcelo at gmail dot com
 Reported by:        sh-ya at ya dot ru
 Summary:            Early binding limitations insufficiently documented
 Status:             Open
 Type:               Documentation Problem
 Package:            Scripting Engine problem
 PHP Version:        7.4.19
 Block user comment: N
 Private report:     N

 New Comment:

Late binding is still useful in situations where the exact interface of an object is not known at design-time. Early Binding has several advantages. Because the Object Model of the other application is known to Excel during development, the developer can make use of Intellisense and the Object Browser to help write his code. Semi-descriptive constants, such as ppLayoutTitle and xlXYScatter, can be used. (https://www.prepaidgiftbalance.vip)github.com


Previous Comments:
------------------------------------------------------------------------
[2021-05-17 13:54:48] [email protected]

Traits (and for that matter interfaces) prevent early binding. Early binding if a legacy feature that we have no plans to extend. You should either declare classes in the correct order or use autoloading.

As such, I am moving this back to docs.

------------------------------------------------------------------------
[2021-05-17 13:13:13] [email protected]

Maybe there is actually a bug, but I don't think it will be fixed.

------------------------------------------------------------------------
[2021-05-17 12:58:18] sh-ya at ya dot ru

comment out "use SomeTrait" and that order will work

------------------------------------------------------------------------
[2021-05-17 10:43:30] [email protected]

The problem is the order of the definitions.  Animal cannot be
resolved until AnimalFood is defined, and that trips up the
script.  This is basically documented[1]:

| Unless autoloading is used, the classes must be defined before
| they are used. If a class extends another, then the parent class
| must be declared before the child class structure. This rule
| applies to classes that inherit other classes and interfaces.

So yes, the best solution is to use autoloading; alternatively you
can fix the order of definitions[2] (that may not always be
possible).

[1] <https://www.php.net/manual/en/language.oop5.inheritance.php>
[2] <https://3v4l.org/RsDcu>

------------------------------------------------------------------------
[2021-05-13 12:55:25] sh-ya at ya dot ru

Description:
------------
using the variance requires pre-definition of classes that use traits

Test script:
---------------
interface Animal {
	public function eat(AnimalFood $food);
}

class Dog implements Animal {
	public function eat(Food $food) {}
}

trait SomeTrait {
	public $b = true;
}

class Food {
	use SomeTrait;
	public $i = 0;
}

class AnimalFood extends Food {}


var_dump(new AnimalFood);


Expected result:
----------------
object(AnimalFood)#1 (2) {
  ["i"]=>
  int(0)
  ["b"]=>
  bool(true)
}

Actual result:
--------------
Fatal error: Could not check compatibility between Dog::eat(Food $food) and Animal::eat(AnimalFood $food), because class AnimalFood is not available in ...


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=81038&edit=1