オブジェクト指向プログラミング (OOP、オブジェクト指向プログラミング) は、コンピューター プログラミング アーキテクチャの 1 つです。OOP の基本原理の 1 つは、コンピューター プログラムが、OOP の 3 つの目標を達成するための単一のユニットまたはオブジェクトで構成されることです。ソフトウェア エンジニアリングの重要な点は、再利用性、柔軟性、拡張性です。全体的な操作を実現するために、各オブジェクトは情報を受信し、データを処理し、他のオブジェクトに情報を送信できます。オブジェクト指向はソフトウェア開発の分野で常に注目されています。まず第一に、オブジェクト指向は人間の物の見方の一般的なルールと一致しています。第二に、オブジェクト指向の手法を使用することで、システムの各部分がそれぞれの役割を果たし、任務を遂行できるようになります。これにより、プログラマーは、よりシンプルで保守が容易で再利用可能なコードを作成できるようになります。 PHP は真のオブジェクト指向言語ではないという人もいますが、これは事実です。 PHP はハイブリッド言語であり、OOP または従来の手続き型プログラミングを使用できます。ただし、大規模なプロジェクトの場合は、純粋な OOP を使用して PHP でクラスを宣言し、プロジェクト内でオブジェクトとクラスのみを使用する必要がある場合があります。この概念については詳しく説明しません。多くの友人がオブジェクト指向プログラミングから遠ざかる主な理由は、オブジェクト指向プログラミングに触れても理解できないため、学びたくないからです。 。全体的な内容を読んだ後、読者にコンセプトを理解してもらいます。
クラスの概念: クラスは、同じプロパティとサービスを持つオブジェクトのコレクションです。これは、このクラスに属するすべてのオブジェクトに対して統一された抽象的な説明を提供します。これには、プロパティとサービスという 2 つの主要な部分が含まれます。オブジェクト指向プログラミング言語では、クラスは独立したプログラム単位であり、クラス名を持ち、属性の説明とサービスの説明という 2 つの主要な部分を含む必要があります。
オブジェクトの概念: オブジェクトは、システム内の客観的なものを記述するために使用される実体であり、システムを構成する基本単位です。オブジェクトは、プロパティのセットと、プロパティのセットに対して動作するサービスのセットで構成されます。より抽象的な観点から見ると、オブジェクトは、問題ドメインまたは実装ドメイン内の何かを抽象化したもので、そのオブジェクトが保存する必要がある情報と、オブジェクトがシステム内で果たす役割とを反映しています。これらの属性は、操作を実行する一連のサービスのカプセル化によって制御されます。客観的な世界は、オブジェクトとオブジェクト間の接続で構成されます。
クラスとオブジェクトの関係は、型と鋳物の関係に似ています。クラスのインスタンス化の結果がオブジェクトであり、オブジェクトの型を抽象化したものがクラスです。クラスは、同じ特性 (プロパティ) と同じ動作 (メソッド) を持つオブジェクトのグループを記述します。
上記はおそらくオブジェクト指向の定義です。中関村に行って組み立て済みの PC を購入したい場合に、その概念に混乱しないでください。最初のステップは何ですか? 設置エンジニアがあなたと一緒に座って、あなたが提供した情報に基づいて設置設定シートを作成しますか? この設定シートは単なる紙に過ぎません。この構成リストを使用して 10 台のマシンを購入すると、これらの 10 台のマシンはすべてこの構成リストに従って構成されるため、これらの 10 台のマシンは同じ種類であると言えます。同じタイプであること。では、オブジェクトとは何でしょうか? この構成シートを使用して構成 (インスタンス化) されたマシンはオブジェクトであり、10 台のマシン、10 個のオブジェクトを操作できます。各マシンは独立しています。これは、いずれかのマシンで実行されたアクションは他の 9 台のマシンには影響しません。ただし、クラスを変更する場合は、この構成リストに 1 つ以下を追加します。アクセサリの場合、インストールされている 9 台のマシンすべてが変更されます。これは、クラスとオブジェクトの関係です (クラスのインスタンス化の結果はオブジェクトです)。
彼のコンセプトは言うまでもありませんが、コンピューター教室を建てたい場合は、まず N 台のコンピューター、N 個のテーブル、N 個の椅子、ホワイトボード、プロジェクターなどを備えた部屋を用意する必要があります。先ほど述べたように、これらは何ですか? 、このコンピュータ教室の単位はこれらのエンティティ オブジェクトであると言えます。したがって、私たちはプログラムを実行しています。これは、オブジェクトが何をするのかを指向しているのと同じです。それと?システム プログラムの開発は、コンピュータ教室を構築することに似ています。システムは、情報を受信し、データを処理し、他のオブジェクトにデータを送信することができる、複数のオブジェクトで構成されます。などのやり取りが行われます。オブジェクト指向プログラムを構成します。
上で紹介したように、オブジェクト指向プログラムの単位はオブジェクトですが、オブジェクトはクラスによってインスタンス化されるので、最初にクラスを宣言するだけで済み、クラスを作るのは簡単です。基本的なプログラム文法の定義ルールをマスターすればできるようになりますが、何が難しいでしょうか?プロジェクトで使用するクラスとオブジェクトの数、クラスを定義する場所、定義するクラスの種類、このクラスによってインスタンス化されるオブジェクトの数、クラス内に属性がいくつあるか、メソッドがいくつあるか、これには、読者が実際の開発における実際的な問題を分析、設計、要約することが必要です。
クラス定義: クラス クラス名 { }
キーワード class の後に、必要なクラス名と中括弧のペアを使用します。このようにして、クラスの構造を定義します。しかし、そこには何が書かれているのでしょうか。 何を書けばいいでしょうか?完全なクラスを作成するにはどうすればよいですか?上で述べたように、クラスを使用する目的は、それを使用するためのオブジェクトにすることです。これには、上で説明したインストール構成シートと同様に、インストール構成シートに何が書かれているかを知る必要があります。機械にはすべてが備わっています。たとえば、ある人がターゲットです。自分の好きな人をどのようにリーダーに推薦しますか?もちろん、詳細であればあるほど良いです:
まず、相手の名前、性別、年齢、身長、体重、電話番号、自宅住所などを紹介します。
次に、この人が何ができるか、運転ができるか、英語を話せるか、コンピュータが使えるかなどを紹介しなければなりません。
あなたがもっと紹介すれば、他の人もこの人物についてもっと知ることができます。これが私たちの人物の説明です。ここで要約しましょう。上記の人物の説明から、私たちが使用するすべてのオブジェクトは似ていることがわかります。クラスを作成すると、定義の観点から 2 つの部分に分かれます。1 つ目は静的な記述で、2 つ目は、上で見たように属性と呼ばれるものです。性別、年齢、身長、体重、電話番号、自宅住所など動的に言うと、それは人間のオブジェクトの機能です。たとえば、この人は車を運転することができ、英語を話し、コンピューターを使用することができます。動的をプログラムに抽象化すると、関数やメソッドになります。同じ。したがって、すべてのクラスは属性とメソッドという観点から記述されます。属性はこのクラスのメンバー属性とも呼ばれ、メソッドはこのクラスのメンバー メソッドとも呼ばれます。
クラスの人たち{
メンバー属性:名前、性別、年齢、身長、体重、電話番号、自宅住所
会員条件:車の運転ができる、英語が話せる、パソコンが使える
}
クラス定義内でキーワード「var」を使用して変数を宣言することで、クラスの属性が作成されますが、メンバー属性の宣言時に初期値を与えることができますが、クラス宣言時にメンバー属性の初期値はありません。必要です。たとえば、人の名前を「Zhang San」に割り当てる場合、このクラス インスタンスを使用して数十人を作成すると、その数十人の名前が Zhang San になるため、このメンバーを指定する必要はありません。インスタンスがオブジェクトを作成した後の属性は、初期値で問題ありません。例: var $somevar;
リーリー上記はクラスの宣言、属性とメソッドで宣言したクラスですが、作るクラスは記述情報であり、メンバ属性を宣言する際には初期値を与えない方が良いです。たとえば、10 人の人間オブジェクトがインスタンス化された場合、これらの 10 人はそれぞれ異なる名前、性別、年齢を持つことになるため、初期値を割り当てないことをお勧めします。ここではメンバー属性を指定しますが、各メンバー属性に個別に値が割り当てられます。
同じメソッドを使用して、属性とメソッドを使用してエンティティを記述することができれば、それらをクラスとして定義し、オブジェクトをインスタンス化できます。
クラスの理解を強化するために、形状の範囲が少し広い別のクラスを作成してみましょう。まず、長方形の性質を 2 つの側面から考えてみましょう。そこには?長方形の機能は何ですか?
リーリー リーリーこのクラスを使用して複数の長方形オブジェクトを作成する場合、各長方形オブジェクトは独自の長さと幅を持ち、独自の周囲長と面積を計算できます。
オブジェクト指向プログラムの単位はオブジェクトであると上で述べましたが、オブジェクトはクラスを通じてインスタンス化されます。クラスが宣言されたので、次のステップはオブジェクトをインスタンス化することです。クラスを定義した後、new キーワードを使用してオブジェクトを生成します。
<?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=new Person();
这条代码就是通过类产生实例对象的过程,$p1就是我们实例出来的对象名称,同理,$p2, $p3也是我们实例出来的对象名称,一个类可以实例出多个对象,每个对象都是独立的,上面的代码相当于实例出来3个人来,每个人之间是没有联系的,只能说明他们都是人类,每个人都有自己的姓名,性别和年龄的属性,每个人都有说话和走路的方法,只要是类里面体现出来的成员属性和成员方法,实例化出来的对象里面就包含了这些属性和方法。
对像在PHP里面和整型、浮点型一样,也是一种数据类,都是存储不同类型数据用的,在运行的时候都要加载到内存中去用, 那么对象在内存里面是怎么体现的呢?内存从罗辑上说大体上是分为4段, 栈空间段、堆空间段、代码段、 初始化静态段,程序里面不同的声明放在不同的内存段里面,栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1, 10, 100, 1000, 10000, 100000等等,在内存里面占用空间是等长的,都是64位4个字节。 那么数据长度不定长,而且占有空间很大的数据类型的数据放在那内存的那个段里面呢?这样的数据是放在堆内存里面的。栈内存是可以直接存取的,而堆内存是不可以直接存取的内存。对于我们的对象来数就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通过对象名称就可以使用对象了。
$p1=new Person();
对于这个条代码, $p1是对象名称在栈内存里面,new Person()是真正的对象是在堆内存里面的。
每个在堆里面的实例对象是存储属性的,比如说,现在堆里面的实例对象里面都存有姓名、性别和年龄。每个属性又都有一个地址。$p1=new Person();等号的右边$p1是一个引用变量,通过赋值运算符“=”把对象的首地址赋给“$p1”这个引用变量,所以$p1是存储对象首地址的变量,$p1放在栈内存里边,$p1相当于一个指针指向堆里面的对象,所以我们可以通过$p1这个引用变量来操作对象,通常我们也称对象引用为对象。
上面看到PHP对象中的成员有两种一种是成员属性,一种是成员方法。对象我们已经可以声明了,$p1=new Person();怎么去使用对象的成员呢?要想访问对象中的成员就要使用一个特殊的操作符“->”来完成对象成员的访问:
对象->属性 $p1->name; $p2->age; $p3->sex;
对象->方法 $p1->say(); $p2->run();
<?php class Person { //下面是人的成员属性 var $name; //人的名子 var $sex; //人的性别 var $age; //人的年龄 //下面是人的成员方法 function say() //这个人可以说话的方法 { echo "这个人在说话"; } function run() //这个人可以走路的方法 { echo "这个人在走路"; } } $p1=new Person(); //创建实例对象$p1 $p2=new Person(); //创建实例对象$p2 $p3=new Person(); //创建实例对象$p3 //下面三行是给$p1对象属性赋值 $p1->name=”张三”; $p1->sex=”男”; $p1->age=20; //下面三行是访问$p1对象的属性 echo “p1对象的名子是:”.$p1->name.”<br>”; echo “p1对象的性别是:”.$p1->sex.”<br>”; echo “p1对象的年龄是:”.$p1->age.”<br>”; //下面两行访问$p1对象中的方法 $p1->say(); $p1->run(); //下面三行是给$p2对象属性赋值 $p2->name=”李四”; $p2->sex=”女”; $p2->age=30; //下面三行是访问$p2对象的属性 echo “p2对象的名子是:”.$p2->name.”<br>”; echo “p2对象的性别是:”.$p2->sex.”<br>”; echo “p2对象的年龄是:”.$p2->age.”<br>”; //下面两行访问$p2对象中的方法 $p2->say(); $p2->run(); //下面三行是给$p3对象属性赋值 $p3->name=”王五”; $p3->sex=”男”; $p3->age=40; //下面三行是访问$p3对象的属性 echo “p3对象的名子是:”.$p3->name.”<br>”; echo “p3对象的性别是:”.$p3->sex.”<br>”; echo “p3对象的年龄是:”.$p3->age.”<br>”; //下面两行访问$p3对象中的方法 $p3->say(); $p3->run(); ?>
从上例中可以看出只是对象里面的成员就要使用对象->属性、对象->方法形式访问,再没有第二种方法来访问对象中的成员了。
现在我们知道了如何访问对象中的成员,是通过“对象->成员”的方式访问的,这是在对象的外部去访问对象中成员的形式,那么如果我想在对象的内部,让对象里的方法访问本对象的属性,或是对象中的方法去调用本对象的其它方法这时我们怎么办?因为对象里面的所有的成员都要用对象来调用,包括对象的内部成员之间的调用,所以在PHP里面给我提供了一个本对象的引用$this, 每个对象里面都有一个对象的引用$this来代表这个对象,完成对象内部成员的调用, this的本意就是“这个”的意思, 上面的实例里面,我们实例化三个实例对象$P1、 $P2、 $P3,这三个对象里面各自存在一个$this分别代表对象$p1、$p2、$p3 。
通过上图我们可以看到,$this就是对象内部代表这个对象的引用,在对象内部和调用本对象的成员和对象外部调用对象的成员所使用的方式是一样的。
$this->属性 $this->name; $this->age; $this->sex;
$this->方法 $this->say(); $this->run();
修改一下上面的实例,让每个人都说出自己的名字,性别和年龄:
<?php class Person { //下面是人的成员属性 var $name; //人的名子 var $sex; //人的性别 var $age; //人的年龄 //下面是人的成员方法 function say() //这个人可以说话的方法 { echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"; } function run() //这个人可以走路的方法 { echo "这个人在走路"; } } $p1=new Person(); //创建实例对象$p1 $p2=new Person(); //创建实例对象$p2 $p3=new Person(); //创建实例对象$p3 //下面三行是给$p1对象属性赋值 $p1->name="张三"; $p1->sex="男"; $p1->age=20; //下面访问$p1对象中的说话方法 $p1->say(); //下面三行是给$p2对象属性赋值 $p2->name="李四"; $p2->sex="女"; $p2->age=30; //下面访问$p2对象中的说话方法 $p2->say(); //下面三行是给$p3对象属性赋值 $p3->name="王五"; $p3->sex="男"; $p3->age=40; //下面访问$p3对象中的说话方法 $p3->say(); ?>
分析一下这个方法:
function say() //这个人可以说话的方法
{
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."
";
}
在$p1、$p2和$p3这三个对象中都有say()这个方法,$this分别代表这三个对象, 调用相应的属性,打印出属性的值,这就是在对象内部访问对象属性的方式, 如果相在say()这个方法里调用run()这个方法也是可以的,在say()这个方法中使用$this->run()的方式来完成调用。
大多数类都有一种称为构造函数的特殊方法。当创建一个对象时,它将自动调用构造函数,也就是使用new这个关键字来实例化对象的时候自动调用构造方法。
构造函数的声明与其它操作的声明一样,只是其名称必须是__construct( )。这是PHP5中的变化,以前的版本中,构造函数的名称必须与类名相同,这种在PHP5中仍然可以用,但现在以经很少有人用了,这样做的好处是可以使构造函数独立于类名,当类名发生改变时不需要改相应的构造函数名称了。为了向下兼容,如果一个类中没有名为__construct( )的方法,PHP将搜索一个php4中的写法,与类名相同名的构造方法。
在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。比如对成属性在创建对象的时候赋初值。
<? //创建一个人类 class Person { //下面是人的成员属性 var $name; //人的名子 var $sex; //人的性别 var $age; //人的年龄 //定义一个构造方法参数为姓名$name、性别$sex和年龄$age function __construct($name, $sex, $age) { //通过构造方法传进来的$name给成员属性$this->name赋初使值 $this->name=$name; //通过构造方法传进来的$sex给成员属性$this->sex赋初使值 $this->sex=$sex; //通过构造方法传进来的$age给成员属性$this->age赋初使值 $this->age=$age; } //这个人的说话方法 function say() { echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"; } } //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄 $p1=new Person(“张三”,”男”, 20); $p2=new Person(“李四”,”女”, 30); $p3=new Person(“王五”,”男”, 40); //下面访问$p1对象中的说话方法 $p1->say(); //下面访问$p2对象中的说话方法 $p2->say(); //下面访问$p3对象中的说话方法 $p3->say(); ?>
与构造函数相对的就是析构函数。析构函数是PHP5新添加的内容,在PHP4中没有析构函数。析构函数允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件,释放结果集等,析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行,也就是对象在内存中被销毁前调用析构函数。与构造函数的名称类似,一个类的析构函数名称必须是__destruct( )。析构函数不能带有任何参数。
<? //创建一个人类 class Person { //下面是人的成员属性 var $name; //人的名子 var $sex; //人的性别 var $age; //人的年龄 //定义一个构造方法参数为姓名$name、性别$sex和年龄$age function __construct($name, $sex, $age) { //通过构造方法传进来的$name给成员属性$this->name赋初使值 $this->name=$name; //通过构造方法传进来的$sex给成员属性$this->sex赋初使值 $this->sex=$sex; //通过构造方法传进来的$age给成员属性$this->age赋初使值 $this->age=$age; } //这个人的说话方法 function say() { echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"; } //这是一个析构函数,在对象销毁前调用 function __destruct() { echo “再见”.$this->name.”<br>”; } //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄 $p1=new Person(“张三”,”男”, 20); $p2=new Person(“李四”,”女”, 30); $p3=new Person(“王五”,”男”, 40); //下面访问$p1对象中的说话方法 $p1->say(); //下面访问$p2对象中的说话方法 $p2->say(); //下面访问$p3对象中的说话方法 $p3->say(); ?>
封装性是面向对象编程中的三大特性之一,封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义:1.把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。2.信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界〔或者说形成一道屏障〕,只保留有限的对外接口使之与外部发生联系。
封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的"交叉感染",使软件错误能够局部化,大大减少查错和排错的难度。
用个实例来说明吧,假如某个人的对象中有年龄和工资等属性,像这样个人隐私的属性是不想让其它人随意就能获得到的,如果你不使用封装,那么别人想知道就能得到,但是如果你封装上之后别人就没有办法获得封装的属性,除非你自己把它说出去,否则别人没有办法得到。
再比如说,个人电脑都有一个密码,不想让其它人随意的登陆,在你的电脑里面拷贝和粘贴。还有就是像人这个对象,身高和年龄的属性,只能是自己来增涨,不可以让别人随意的赋值等等。
使用private这个关键字来对属性和方法进行封装:
原来的成员: var $name; //声明人的姓名 var $sex; //声明人的性别 var $age; //声明人的年龄 function run(){…….} 改成封装的形式: private $name; //把人的姓名使用private关键字进行封装 private $sex; //把人的性别使用private关键字进行封装 private $age; //把人的年龄使用private关键字进行封装 private function run(){……} //把人的走路方法使用private关键字进行封装 注意:只要是成员属性前面有其它的关键字就要去掉原有的关键字“var”。
通过private就可以把人的成员(成员属性和成员方法)封装上了。封装上的成员就不能被类外面直接访问了,只有对象内部自己可以访问;
私有的成员是不能被外部访问的, 因为私有成员只能在本对象内部自己访问,比如,$p1这个对象自己想把他的私有属性说出去,在say()这个方法里面访问了私有属性,这样是可以。(没有加任何访问控制,默认的是public的,任何地方都可以访问)
因为构造方法是默认的公有方法(构造方法不要设置成私有的),所以在类的外面可以访问到,这样就可以使用构造方法创建对象, 另外构造方法也是类里面的函数,所以可以用构造方法给私有的属性赋初值。Say()的方法是默认公有的, 所以在外面也可以访问的到, 说出他自己的私有属性。
上記の例から、プライベート メンバーはクラス内でのみ使用でき、クラス外からは直接アクセスできないことがわかります。ただし、クラス内にアクセスする権限があるため、プライベート プロパティの割り当てと読み取りが必要になる場合があります。外部からとは、クラスの外部にアクセス可能なインターフェイスを提供することを意味します。上記の例では、コンストラクターは代入の形式ですが、コンストラクターはオブジェクトを作成するときに値を代入するだけです。この既存のオブジェクトに値を割り当てたい場合、コンストラクター メソッドを使用して値を渡すと、既存のオブジェクトではなく新しいオブジェクトが作成されます。したがって、外部からアクセスできるプライベート属性用のインターフェイスをいくつか作成する必要があります。目的は、オブジェクトが存在するときに属性の値を変更してアクセスすることです。ただし、これは必要な属性に対してのみ実行できることに注意してください。外部からアクセスされることを望まないプロパティにはそのようなインターフェイスがありません。そのため、カプセル化の目的はオブジェクト自体によって完了し、オブジェクトへの操作は最小限に抑えられます。外の世界。
です。