オブジェクト指向について話すとき、まずこれまでのプログラミングのアイデアを復習しましょう。いわゆるプログラミングのアイデアは、知識の本質的な原則に基づいてプログラムについて論理的に推論するプロセスです。プログラミングのアイデアの重点は、まず何をするかを明確にすることです。行われることです。コードを残すときは、これを行う方法を理解できなければなりません。コードを再度暗記する代わりに。やりたいことに応じて、既知のさまざまな条件を確認し、条件がない場合は自分で条件を作成する必要があります。つまり、条件を知り、結果を知り、過程を求める。 実際のプログラムでは、満足のいく条件を作成するために多くの準備作業を行う必要があることがよくあります。たとえば、MySQL でデータを出力するには、プログラム内でデータをどこに出力するかを知るためにページング計算を準備する必要があります。 1 つの機能または 1 つのプロセスでは、機能全体のニーズを満たすことはできません。完了するには、いくつかのプロセスの協力が必要です。たとえば、Web ページを開いたときの動作、フォームの送信時の動作、フォームが送信されなかったときの動作、データベースに接続できないときの動作などです。 、接続された場合の対処方法。フォームが送信されていない場合 ($_POST が空の場合)、フォームを表示します。データが送信されると、データベースに接続し、SQL ステートメントを整理してデータベースに書き込みます。次に、ユーザーにプロンプト ページを表示します。まとめると、プログラム全体を考えると、ここでプログラムが実行されるときに何をする必要があるか、次のプロセスのニーズを満たすにはどうすればよいかを考え、これらの処理の組み合わせでのみ満たすことができます。まとめると、プロセス指向の思考モデルには、何かをいつ行うか、どのように行うか、プロセスのすべてのステップという共通の特徴があります。これはプロセス指向です。
実際、私たちがコードを書くとき、その90%以上はプロセス指向であり、オブジェクト指向は単なる考え方の名前にすぎず、私たちもオブジェクト指向の考え方を使っていることが多いですが、それを知りません。次のコードは簡単な例です:
リーリーコードの一部がプロセスに対応します
データベースを読んでいると多くの人がこう思うはずです。 //データベースに接続します //データベースをクエリします //結果を表示します
本人確認であれば。もう一つプロセスがあります。 //データベースに接続します//データベースをクエリします//ユーザー名とパスワードを比較します//結果を表示します。このコメントは実際にはアイデアを説明したもので、ある程度のレベルまでコードを書くことに慣れてくると、一行ずつ考える必要はなくなります。私たちはプロセスをほんの数行のコードとして考えることがよくありますが、コードの実際の機能は思考プロセスと一致している必要があります。
まだ上記のコードです
リーリー $file = "test.txt";この書き方は、先ほど説明した、ファイルの内容を読み取る方法とより一致しています。ここで $file について考えるときは、それをファイルとして考えます。
別の例として、グラフィックス処理プロセスは、画像を作成し、画像に書き込み、画像に線を描画し、画像を出力し、この量のリソースを画像そのものとして扱うと理解できます。
いわゆるオブジェクト指向は、思考モードの説明です。この思考モードでは、ファイルを読み取ったり、データを処理したり、ファイルに書き込んだりする、それぞれのものをエンティティとして処理することを想像します。 。画像を作成する、画像に描画する、画像に書き込む、画像を出力するなど、コードの本質から見てもさまざまな量がありますが、これを潜在意識で知っておく必要があります。考えたり説明したりするときは、こうやって一つ一つ考えていくと。それは思考に一定の困難をもたらすでしょう。そして、上記の考え方と説明方法を使用してください。この考え方はオブジェクト指向です。上記のプロセス指向の考え方に似た文は、次のとおりです。 手続き指向とは、いつ、何をするか、どのように行うかということです
オブジェクト指向とは、いつ、何を 符合度百分之百,当然前提你得知道怎么封装这样一个函数,在此由于$file是文件名 将它视为文件有点牵强,但我们可以理解为文件的路径path,所以 最好使用类去封装。 用我们日常生活的常识来理解对象的话 对象时一个个实体,那么它对应的就应该有一些特性,比如说文件名是什么,路径是多少,文件大小多少,比如说我们人 有身高体重名字性别,但是,在我们平时的制作手法里面。我们要知道一个文件大小。就必须用 filesize 函数去取得。这就像我问你身高是多少,你每次都要重新量一下。 这和我们常识中的对象,存在一定的差距,使得我们在思考描述代码的时候。代码的符合度不够。 但是类可以暂时记住这些特征值,我们称之为对象的属性,属性,一定是一个准确的值,而过程在类里面称为方法,类里面 可以声明一些特殊的变量,这些变量外部不能直接访问到,这些就是类的属性,要想访问一个类的属性和方法一样使用-> 但是不需要写$,假如我们有一个file类 有一个属性 用这种方式来访问一个对象变量的属性 怎么定义它 我们先不急 慢慢道来 ,我们先回到思路上,今天我们封装一个文件读写类 我们的代码在需要文件读写的时候我们这样思考:读取文件 处理数据 写入文件 ,这个思路正是文件型计数器的思路。 那么,我们最好的写法是 这两个函数。都是同属于文件操作的。我们把它封装成为类 调用这个类的时候。代码是这么写的。 现在回到read方法 既然他已经有属性 知道自己名字和大小了 那在这里就不用再传文件名进去了,
するかということです。オブジェクト指向の場合、その方法が 1 つ少なくなります。これは、オブジェクト指向の前提条件が、その方法を知っていない場合に常に最初にプロセス指向を学ぶ理由です。何かをする方法は知っていますが、それがどのような思考モードであるかについては話せません。実は、画像処理機能は最初から最後までオブジェクト指向の思考モデルに基づいて開発されており、その思考モデルは書き方に限定されるものではありません。さまざまな関数の実装テクニックを習得した後は、この方法で書くのがオブジェクト指向であり、その方法で書くのがプロセス指向であることがわかります。私たちはカプセル化を通じてコードを再利用する傾向があります。では、どのようにすればより合理的な梱包ができるのでしょうか?このとき、先ほども言いましたが、考え方を見てください。アイデアの説明はコードと一致している必要があります。したがって、カプセル化はランダムなカプセル化ではなくなります。カプセル化された関数とクラスを使用する場合は、「考え方」で説明したのと同じ記述形式で使用するのが最善です。 。そしてアイデアの説明。 。可能な限り一致させます。
比如,我把刚才读取文件的过程。封装成一个函数
<span function</span> read(<span $file</span><span ) {
}
</span><span //</span><span 读取文件</span>
<span $data</span> = read(<span $file</span>);
<span $file</span> = <span new</span> <span file</span><span ();
</span><span echo</span> <span $file</span>->size;
<span $data</span> = read(<span $file</span><span );
</span><span $data</span> +=1<span ;
write(</span><span $file</span>, <span $data</span>);
<span function</span> read(<span $file</span><span ) {
</span><span $fp</span> = <span fopen</span>(<span $file</span>, "r"<span );
</span><span $data</span> = <span fread</span>(<span $fp</span>, <span filesize</span>(<span $file</span><span ));
</span><span fclose</span>(<span $fp</span><span );
</span><span return</span> <span $data</span><span ;
}
</span><span function</span> write(<span $file</span>, <span $data</span><span ) {
</span><span $fp</span> = <span fopen</span>(<span $file</span>, "w"<span );
</span><span $rs</span> = <span fwrite</span>(<span $fp</span>, <span $data</span><span );
</span><span fclose</span>(<span $fp</span><span );
</span><span return</span> <span $rs</span><span ;
}</span>
<span class</span><span fileclass {
</span><span function</span> read(<span $file</span><span ) {
</span><span $fp</span> = <span fopen</span>(<span $file</span>, "r"<span );
</span><span $data</span> = <span fread</span>(<span $fp</span>, <span filesize</span>(<span $file</span><span ));
</span><span fclose</span>(<span $fp</span><span );
</span><span return</span> <span $data</span><span ;
}
</span><span function</span> write(<span $file</span>, <span $data</span><span ) {
</span><span $fp</span> = <span fopen</span>(<span $file</span>, "w"<span );
</span><span $rs</span> = <span fwrite</span>(<span $fp</span>, <span $data</span><span );
</span><span fclose</span>(<span $fp</span><span );
</span><span return</span> <span $rs</span><span ;
}
}<br /><br /></span>
<span $fc</span> = <span new</span><span fileclass();<br />//读取文件
</span><span $data</span> = <span $fc</span>->read(<span $file</span><span );
</span><span $data</span> +=1<span ;<br />//写入文件
</span><span $fc</span>->write(<span $file</span>, <span $data</span>);
然而这里有个和思路不符的地方,上下的两个$file可以是两个不同的文件,也就是说我可以从文件A读取内容写入到文件B中,但是这样一来就是两个文件,就是两个对象,这个和思路不符,在这个代码中,我们没办法准确的描述出。哪一个量。可以视为这个文件。 尽管使用了类从思维上还是面向的过程,之前说过 作为对象应该有自己的属性,对象 应该知道自己的属性,我们希望 用一个实例化的量 来表示这个对象,一个对象 一旦出现就知道自己的属性,就如我们都知道的姓名和性别,要做到这几点,我们需要修改类的结构,一开始就知道。。就是说。一开始就得知道文件名。而且一开始就要读取文件大小。 毕竟,没有这些过程 不可能凭空得到。在类里面。构造函数可以帮我们做到这一点。构造函数。会在类实例化的时候立即执行。我们可以在构造函数里读取文件的大小,要读取文件大小,同样需要知道文件名。 这就需要一个条件。可以通过函数参数传入。
<span public</span> <span function</span> __construct(<span $file</span><span ) {
</span><span $size</span> = <span filesize</span>(<span $file</span><span );
}</span>
我们都知道,自定义函数内部变量和外部变量。不是同一个世界的。 也就是说。在这里给 $size 赋值。属性 size 是得不到的。 在这里 在类的方法里面,要想访问类的属性和其他方法。需要用关键字 $this->
<?<span php
</span><span class</span><span fileclass {
</span><span public</span> <span $size</span> = 0<span ;
</span><span public</span> <span $name</span> = ''<span ;
</span><span public</span> <span function</span> __construct(<span $file</span><span ) {
</span><span $size</span> = <span filesize</span>(<span $file</span><span );
</span><span $this</span>->size = <span $size</span><span ;
</span><span $this</span>->name = <span $file</span><span ;
}
</span><span function</span> read(<span $file</span><span ) {
</span><span $fp</span> = <span fopen</span>(<span $file</span>, "r"<span );
</span><span $data</span> = <span fread</span>(<span $fp</span>, <span filesize</span>(<span $file</span><span ));
</span><span fclose</span>(<span $fp</span><span );
</span><span return</span> <span $data</span><span ;
}
</span><span function</span> write(<span $file</span>, <span $data</span><span ) {
</span><span $fp</span> = <span fopen</span>(<span $file</span>, "w"<span );
</span><span $rs</span> = <span fwrite</span>(<span $fp</span>, <span $data</span><span );
</span><span fclose</span>(<span $fp</span><span );
</span><span return</span> <span $rs</span><span ;
}
}
</span><span $fc</span> = <span new</span> fileclass("test.txt"<span );
</span><span echo</span> "文件名:" . <span $fc</span>-><span name;
</span><span echo</span> "文件大小:" . <span $fc</span>-><span size;
</span>?>
<span function</span><span read() {
</span><span $fp</span> = <span fopen</span>(<span $this</span>->name, "r"<span );
</span><span $data</span> = <span fread</span>(<span $fp</span>, <span filesize</span>(<span $this</span>-><span size));
</span><span fclose</span>(<span $fp</span><span );
</span><span return</span> <span $data</span><span ;
}
</span>
同样的。写入的时候。也不需要再通知文件名了。
<span class</span><span fileclass {
</span><span public</span> <span $size</span> = 0<span ;
</span><span public</span> <span $name</span> = ''<span ;
</span><span public</span> <span function</span><span __construct($file) {
</span><span $size</span> = <span filesize</span>(<span $file</span><span );
</span><span $this</span>->size = <span $size</span><span ;
</span><span $this</span>->name = <span $file</span><span ;
}
</span><span function</span><span read() {
</span><span $fp</span> = <span fopen</span>(<span $this</span>->name, "r"<span );
</span><span $data</span> = <span fread</span>(<span $fp</span>, <span filesize</span>(<span $this</span>->name<span ));
</span><span fclose</span>(<span $fp</span><span );
</span><span return</span> <span $data</span><span ;
}
</span><span function</span> write(<span $data</span><span ) {
</span><span $fp</span> = <span fopen</span>(<span $this</span>->name, "w"<span );
</span><span $rs</span> = <span fwrite</span>(<span $fp</span>, <span $data</span><span );
</span><span fclose</span>(<span $fp</span><span );
</span><span return</span> <span $rs</span><span ;
}
}</span>
现在,整个类就变成了这个样子。 回到刚才的计数器代码。
<span $fc</span> = <span new</span> fileclass("test.txt"<span );
//读取文件
</span><span $data</span> = <span $fc</span>-><span read();
</span><span $data</span> +=1<span ;
</span><span echo</span> <span $data</span><span ;
//写入文件
</span><span $fc</span>->write(<span $data</span>);
由于读取是一个过程,也就是一个方法。从哪读取的? $fc $fc 此时,可以完全的理解为。就是文件本身了。
总结下:面向对象这种思维方式。讲究的是:什么时候,什么东西,做什么 。为了能让代码书写的时候,更符合这种描述方式,我们需要把过程封装起来。而类。只不过是为了能更准确的符合这种思考描述方式而做的准备性封装,不是说用类就是在用 面向对象 编程了。一个类写出来以后。如果在使用的过程中。不符合面向对象的思维方式。。那也只是普通的类,面向对象思维方式。。一定要有准确的对象。。可以把某个量。视为一个实体的东西。也就是“对象” 。归根到底其实是先有思路才有类的。