Doc #81038 [Com]: Early binding limitations insufficiently documented
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] nikic@php.net
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] cmb@php.net
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] cmb@php.net
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
Thread (9 messages)