类继承的问题
今天遇到一个有意思的问题,直接上代码
有一个父类和一个子类
fatherClass.php:
class father{ public $a; function __construct(){ $this->a = 3; }}
son.php:
include 'fatherClass.php';$son = new son();$son -> sonFun();class son extends father{ function sonFun(){ echo 222; }}
运行son.php报错找不到son这个类,问题来了。
1、如果把son继承父类的extends father去掉,则运行正确;
2、如果把fatherClass里的内容直接代替include语句,运行正确;
3、如果像下面一样写,运行也正确
include 'fatherClass.php';class son extends father{ function sonFun(){ echo 222; }}$son = new son();$son -> sonFun();
哪位大神可以解释一下?
回复讨论(解决方案)
father类的名字将fatherclass改成father
include 'father.php';
请遵循 先声明,后使用 的基本原则
作为例外:当类定义和使用同在一个文件中时,定义和使用不分先后
这里 http://www.laruence.com/2008/08/24/427.html
php脚本先被编译成opcode,然后执行
3楼文章的作者好像是个php大牛...看过一些源码级分析,对他的头像有印象
他解释了类继承的编译机制和多重继承的BUG,能解决楼主的第一个疑问
2、如果把fatherClass里的内容直接代替include语句,运行正确;
这个说明include(require?xxxxxx_once?)是在执行期才运行的,编译时压根没鸟它
总结下,zend读取php脚本后,如果发现干净的无继承的类,就先建立出来(接近汇编的'类'结构而不是php的'类'),如果发现有继承类并且他的父类已存在,同样建立,其他代码继续编译。这时php脚本变成了opcode。执行时按顺序运行代码,比如include读取其他php脚本(opcode),复杂继承类的建立,执行汇编码的阶段不会智能识别类定义,只会严格按照php代码的顺序执行。
如果我的想法是对的倒是可以解释楼主的疑问
先有儿子,后有老子。本来就是违背常理的
你不按常理办事,还说是 php 的 bug,就有点过分了
如果 php 做多趟扫描而减低了速度,你有该说 php 太慢了
先有儿子,后有老子。本来就是违背常理的
你不按常理办事,还说是 php 的 bug,就有点过分了
如果 php 做多趟扫描而减低了速度,你有该说 php 太慢了
与其说bug不如解释为“不够人性化”
为了适应各种设计模式,我觉得编译阶段智能一点很好啊~
甚至以后的php版本可能做到html语法解释器那样的智能补全高容错
php提供了opcode缓存扩展,不光是多行扫描的词法解释,再耽误性能的编译机制也有办法解决~更消除了OOP的多文件带来的磁盘IO开销
理解?是php5的一?bug,如果要解?,可以看3?大神的地址。
?程序?,按版主?的,先?明,再使用原?。
多谢各位答疑解惑,平时写代码根本不会先实例化后定义,只是在运行一个SDK的时候发现的这个小问题

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Dans l'héritage de fonction, utilisez le « pointeur de classe de base » et le « pointeur de classe dérivée » pour comprendre le mécanisme d'héritage : lorsque le pointeur de classe de base pointe vers l'objet de classe dérivé, une transformation ascendante est effectuée et seuls les membres de la classe de base sont accessibles. Lorsqu’un pointeur de classe dérivée pointe vers un objet de classe de base, une conversion vers le bas est effectuée (dangereuse) et doit être utilisée avec prudence.

Résolution des erreurs PHP : problèmes rencontrés lors de l'héritage des classes parentes En PHP, l'héritage est une fonctionnalité importante de la programmation orientée objet. Grâce à l'héritage, nous pouvons réutiliser le code existant, l'étendre et l'améliorer sans modifier le code d'origine. Bien que l'héritage soit largement utilisé dans le développement, vous pouvez parfois rencontrer des problèmes d'erreur lors de l'héritage d'une classe parent. Cet article se concentrera sur la résolution des problèmes courants rencontrés lors de l'héritage d'une classe parent et fournira des exemples de code correspondants. Question 1 : la classe parent est introuvable pendant le processus d'héritage de la classe parent, si le système ne le fait pas.

L'héritage et le polymorphisme affectent le couplage des classes : l'héritage augmente le couplage car la classe dérivée dépend de la classe de base. Le polymorphisme réduit le couplage car les objets peuvent répondre aux messages de manière cohérente via des fonctions virtuelles et des pointeurs de classe de base. Les meilleures pratiques incluent l'utilisation de l'héritage avec parcimonie, la définition d'interfaces publiques, l'évitement de l'ajout de données membres aux classes de base et le découplage des classes via l'injection de dépendances. Un exemple pratique montrant comment utiliser le polymorphisme et l'injection de dépendances pour réduire le couplage dans une application de compte bancaire.

Conseils de débogage des erreurs d’héritage : assurez-vous que les relations d’héritage sont correctes. Utilisez le débogueur pour parcourir le code et examiner les valeurs des variables. Assurez-vous d'utiliser correctement le modificateur virtuel. Examinez le problème des diamants d'héritage causé par l'héritage caché. Recherchez les fonctions virtuelles pures non implémentées dans les classes abstraites.

L'héritage est un concept qui nous permet d'accéder aux propriétés et au comportement d'une classe à partir d'une autre classe. La classe qui hérite des méthodes et des variables membres est appelée une superclasse ou classe parent, et la classe qui hérite de ces méthodes et variables membres est appelée une sous-classe ou une sous-classe. En Java, nous utilisons le mot-clé "extends" pour hériter d'une classe. Dans cet article, nous discuterons d'un programme Java permettant de calculer les intérêts sur les dépôts à terme et les dépôts à terme en utilisant l'héritage. Tout d'abord, créez ces quatre fichiers Java - Acnt.java - dans l'IDE de votre machine locale. Ce fichier contiendra une classe abstraite « Acnt » qui est utilisée pour stocker les détails du compte tels que le taux d'intérêt et le montant. Il aura également une méthode abstraite 'calcIntrst' avec le paramètre 'amnt' pour calculer

Comment utiliser le polymorphisme et l'héritage pour gérer les types de données en PHP Introduction : En PHP, le polymorphisme et l'héritage sont deux concepts importants de programmation orientée objet (POO). En utilisant le polymorphisme et l'héritage, nous pouvons gérer différents types de données de manière plus flexible. Cet article présentera comment utiliser le polymorphisme et l'héritage pour gérer les types de données en PHP et montrera leur application pratique à travers des exemples de code. 1. Le concept de base de l'héritage L'héritage est un concept important dans la programmation orientée objet. Il nous permet de créer une classe pouvant hériter des propriétés et des méthodes de la classe parent.

La technologie d'encapsulation et l'encapsulation d'applications en PHP sont un concept important dans la programmation orientée objet. Elle fait référence à l'encapsulation de données et d'opérations sur les données afin de fournir une interface d'accès unifiée aux programmes externes. En PHP, l'encapsulation peut être réalisée via des modificateurs de contrôle d'accès et des définitions de classe. Cet article présentera la technologie d'encapsulation dans PHP et ses scénarios d'application, et fournira quelques exemples de code spécifiques. 1. Modificateurs de contrôle d'accès encapsulés En PHP, l'encapsulation est principalement réalisée via des modificateurs de contrôle d'accès. PHP fournit trois modificateurs de contrôle d'accès,

Explication détaillée de l'héritage de fonction C++ : Maîtriser la relation entre "is-a" et "has-a" Qu'est-ce que l'héritage de fonction ? L'héritage de fonction est une technique en C++ qui associe des méthodes définies dans une classe dérivée à des méthodes définies dans une classe de base. Il permet aux classes dérivées d'accéder et de remplacer les méthodes de la classe de base, étendant ainsi les fonctionnalités de la classe de base. Relations « est-un » et « a-un » Dans l'héritage de fonctions, la relation « est-un » signifie que la classe dérivée est un sous-type de la classe de base, c'est-à-dire que la classe dérivée « hérite » des caractéristiques et du comportement de la classe de base. La relation « possède un » signifie que la classe dérivée contient une référence ou un pointeur vers l'objet de classe de base, c'est-à-dire que la classe dérivée « possède » l'objet de classe de base. SyntaxeVoici la syntaxe permettant d'implémenter l'héritage de fonction : classDerivedClass:pu
