Avons rencontré ce de nombreuses fois et ne sais pas pourquoi ça m'a fait curieux. Certaines classes de travail avant qu'ils ne soient déclarés et d'autres n'ont pas;
Exemple 1
$test = new TestClass(); // top of class
class TestClass {
function __construct() {
var_dump(__METHOD__);
}
}
Sortie
string 'TestClass::__construct' (length=22)
Exemple 2
Lorsqu'une classe étend une autre classe ou implémente une interface
$test = new TestClass(); // top of class
class TestClass implements JsonSerializable {
function __construct() {
var_dump(__METHOD__);
}
public function jsonSerialize() {
return json_encode(rand(1, 10));
}
}
Sortie
Fatal error: Class 'TestClass' not found
Exemple 3
Essayons la même classe au-dessus, mais changer la position
class TestClass implements JsonSerializable {
function __construct() {
var_dump(__METHOD__);
}
public function jsonSerialize() {
return json_encode(rand(1, 10));
}
}
$test = new TestClass(); // move this from top to bottom
Sortie
string 'TestClass::__construct' (length=22)
Exemple 4 ( j'ai testé aussi avec class_exists )
var_dump(class_exists("TestClass")); //true
class TestClass {
function __construct() {
var_dump(__METHOD__);
}
public function jsonSerialize() {
return null;
}
}
var_dump(class_exists("TestClass")); //true
dès qu'il implémente JsonSerializable
( Ou autre)
var_dump(class_exists("TestClass")); //false
class TestClass implements JsonSerializable {
function __construct() {
var_dump(__METHOD__);
}
public function jsonSerialize() {
return null;
}
}
var_dump(class_exists("TestClass")); //true
Aussi Vérifié Les Opcodes without
JsonSerializable
line # * op fetch ext return operands
---------------------------------------------------------------------------------
3 0 > SEND_VAL 'TestClass'
1 DO_FCALL 1 $0 'class_exists'
2 SEND_VAR_NO_REF 6 $0
3 DO_FCALL 1 'var_dump'
4 4 NOP
14 5 > RETURN 1
Aussi Vérifié Les Opcodes with
JsonSerializable
line # * op fetch ext return operands
---------------------------------------------------------------------------------
3 0 > SEND_VAL 'TestClass'
1 DO_FCALL 1 $0 'class_exists'
2 SEND_VAR_NO_REF 6 $0
3 DO_FCALL 1 'var_dump'
4 4 ZEND_DECLARE_CLASS $2 '%00testclass%2Fin%2FaDRGC0x7f563932f041', 'testclass'
5 ZEND_ADD_INTERFACE $2, 'JsonSerializable'
13 6 ZEND_VERIFY_ABSTRACT_CLASS $2
14 7 > RETURN 1
Question
- Je connais
Example 3
a fonctionné parce que la classe a été déclaré avant son lancé, mais pourquoi serait -Example 1
de travail en premier lieu ? - Comment est-ce tout le processus de l'extension ou de l'interface de travail dans le PHP pour faire une bonne et l'autre non valide?
- Ce qui se passe Exactement dans l'Exemple 4?
-
Opcodes
était censé rendre les choses claires, mais juste le fait qu'il est plus complexe, carclass_exists
a été appelé avantTestClass
, mais l'inverse est le cas.