L'unité d'un programme orienté objet est un objet, mais un objet est instancié par une classe. Maintenant que notre classe a été déclarée, l'étape suivante consiste à instancier l'objet. Ci-dessous, nous allons vous présenter comment instancier des objets.
Après avoir défini la classe, nous utilisons le mot-clé new pour générer un objet.
$nom de l'objet = nouveau nom de classe ();
<?php class Person { //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //下面是人的成员方法 function say() { //这个人可以说话的方法 echo "这个人在说话"; } function run() { //这个人可以走路的方法 echo "这个人在走路"; } } $p1=new Person(); $p2=new Person(); $p3=new Person(); ?>
$p1=nouvelle personne() ;
Ce code est le processus de génération d'objets d'instance via des classes. $p1 est le nom de l'objet que nous instancions. De même, $p2 et $p3 sont également les noms des objets que nous instancions. Une classe Plusieurs objets peuvent être instanciés, et chaque objet est indépendant. Le code ci-dessus équivaut à instancier 3 personnes. Cela peut seulement signifier qu'ils sont tous des êtres humains et que chaque personne a son propre nom. ., attributs de sexe et d'âge, chacun a une façon de parler et de marcher, tant qu'il s'agit d'attributs membres et de méthodes membres reflétés dans la classe, l'objet instancié contiendra ces attributs et méthodes.
Les objets en PHP sont également une classe de données comme les entiers et les types à virgule flottante. Ils sont utilisés pour stocker différents types de données et doivent être chargés en mémoire pendant le fonctionnement. , Alors, comment sont les objets. représenté en mémoire ?
La mémoire est grossièrement divisée en 4 segments logiquement, segment d'espace de pile, segment d'espace de tas, segment de code, Initialiser les segments statiques ,
①. Segment d'espace de pile
La pile se caractérise par un petit espace mais un accès rapide par le CPU. Elle est temporairement créée par l'utilisateur pour stocker la variable du programme. En raison de la nature du dernier entré, premier sorti de la pile, celle-ci est particulièrement pratique pour sauvegarder et restaurer des scènes d'appel. En ce sens, nous pouvons considérer la pile comme une zone mémoire destinée au stockage et à l’échange temporaires de données. Segments de mémoire utilisés pour stocker des types de données qui occupent une longueur constante et un petit espace. Par exemple, les entiers 1, 100, 10 000, etc. occupent la même longueur d'espace dans la mémoire, et l'espace occupé est de 32 bits et 4 octets. Les doubles, booléens, etc. peuvent également être stockés dans le segment d'espace de pile.
②.Segment d'espace du tas
Le tas est utilisé pour stocker des segments de mémoire qui sont alloués dynamiquement pendant le fonctionnement du processus. Sa taille n'est pas fixe et peut être étendue ou réduite dynamiquement. Utilisé pour stocker des données avec une longueur de données variable ou une utilisation importante de la mémoire. Par exemple, les chaînes, les tableaux et les objets sont stockés dans cette mémoire.
③.Segment de données
Le segment de données est utilisé pour stocker les variables globales initialisées dans le fichier exécutable. En d'autres termes, il stocke les variables allouées statiquement par le programme.
④.Segment de code
Le segment de code est utilisé pour stocker les instructions de fonctionnement du fichier exécutable, ce qui signifie qu'il s'agit de l'image du programme exécutable dans la mémoire. Le segment de code doit être empêché d'être modifié illégalement au moment de l'exécution, de sorte que seules les opérations de lecture sont autorisées, mais les opérations d'écriture (modification) ne sont pas autorisées. Par exemple, les fonctions du programme sont stockées dans cette mémoire.
Les données de type objet sont un type de données qui occupe un espace relativement grand, et c'est un type de données qui occupe une longueur d'espace variable. Par conséquent, une fois l'objet créé, il est stocké dans la mémoire, mais. la référence à l'objet est toujours stockée dans la pile. Lorsque le programme est en cours d'exécution, les données de la mémoire sont directement accessibles, tandis que la mémoire tas est une mémoire à laquelle il n'est pas possible d'accéder directement, mais les membres de l'objet sont accessibles via le nom de référence de l'objet.
Différentes déclarations du programme sont placées dans différents segments de mémoire
Le segment d'espace de pile occupe la même longueur d'espace et prend moins d'espace. . Les types de données, tels que les entiers 1, 10, 100, 1000, 10000, 100000, etc., occupent la même longueur d'espace dans la mémoire et font tous 64 bits et 4 octets.
Alors, où doit être placé le type de données dont la longueur des données est variable et prend beaucoup de place dans ce segment de mémoire ? Ces données sont placées dans la mémoire tas.
La mémoire de pile est directement accessible, tandis que la mémoire de tas n'est pas directement accessible.
Pour notre objet, il s'agit d'un type de données volumineux et il occupe une longueur d'espace variable. Par conséquent, l'objet est placé dans le tas, mais le nom de l'objet est placé dans la pile. afin que l'objet puisse être utilisé via le nom de l'objet.
$p1=new Person();
Pour ce code, $p1 est le nom de l'objet dans la mémoire de la pile, new Person() est le véritable objet dans la mémoire du tas À l'intérieur, veuillez consulter l'image ci-dessous pour plus de détails :
从上图可以看出$p1=new Person();等号右边是真正的对象实例, 在堆内存里面的实体,上图一共有3次new Person(),所以会在堆里面开辟3个空间,产生3个实例对象,每个对象之间都是相互独立的,使用自己的空间,在PHP里面,只要有一个new这个关键字出现就会实例化出来一个对象,在堆里面开辟一块自己的空间。
每个在堆里面的实例对象是存储属性的,比如说,现在堆里面的实例对象里面都存有姓名、性别和年龄。每个属性又都有一个地址。
$p1=new Person();等号的左边$p1是一个引用变量,通过赋值运算符“=”把对象的首地址赋给“$p1“这个引用变量, 所以$p1是存储对象首地址的变量,$p1放在栈内存里边,$p1相当于一个指针指向堆里面的对象, 所以我们可以通过$p1这个引用变量来操作对象, 通常我们也称对象引用为对象。
验证:
class Person{ public $name; } $obj1 = new Person(); $obj1->name = "test1"; echo $obj1->name; $obj2 = $obj1; $obj2->name = "test2"; echo $obj1->name; echo $obj2->name;
通过测试结果来看,解释是对的。
$p1 是对象的指针而不是对象本身, obj2和 obj1都指向同一块内存,同一个对象。这一点和OOP语言是一样
object(Person)[2] public 'name' => string 'test2' (length=5)
object(Person)[2] public 'name' => string 'test2' (length=5)
可见对象的ID号是一个
如果想得到一个对象的副本,用$obj2 =clone $obj1; 用了clone后会产生一个新对象,分配内存,独立于原来的obj1
参见手册此页 http://www.php.net/manual/zh/language.oop5.cloning.php
$obj2 = $obj1; $obj2 = &$obj1;
一样的效果,一样的解释?
对于object来说,是一样的。 对于普通的变量是不一样的。
$a = 1; $b = $a; $c = &$a;
不一样的
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!