ホームページ  >  記事  >  バックエンド開発  >  PHP 面接のためのオブジェクト指向の知識の概要

PHP 面接のためのオブジェクト指向の知識の概要

不言
不言転載
2019-02-13 15:20:076320ブラウズ

この記事の内容は、PHP 面接に関するオブジェクト指向の知識を紹介するものであり、一定の参考価値がありますので、困っている友人が参考にしていただければ幸いです。

PHP におけるオブジェクト指向の共通知識は次の 7 点です。PHP の面接でよく問われるオブジェクト指向の知識にうまく対処できるよう、以下の点を詳しく紹介します。質問。

関連する推奨事項:「2019 PHP 面接の質問の概要 (コレクション)

オブジェクト指向記事全体の構造に関係するコンテンツ モジュールは次のとおりです。

1. オブジェクト指向とプロセス指向の違いは何ですか?
2. オブジェクト指向の特徴は何ですか?
3. コンストラクターとデストラクターとは何ですか?
4. オブジェクト指向スコープにはどのような種類がありますか?
5. PHP の魔法のメソッドとは何ですか?
6. オブジェクトのクローン作成とは何ですか? ####7. 自分と親の違いは何でしょうか?
8. 抽象クラスとインターフェイスの違いと関係は何ですか?
9. PHP オブジェクト指向の面接でよくある質問の説明

PHP オブジェクト指向に関する内容を 3 つの記事に分けて完全な内容を説明します。では主に1から4の内容を説明し、2回目は5から8の内容を中心に説明し、3回目は9番目の内容を中心に説明します。

次のテキストの内容は、

「PHP プログラマー面接筆記試験ガイド」 書籍から引用しています。転載する場合は、出典を保管してください:

1 . オブジェクト指向とプロセス指向の違いは何ですか?

オブジェクト指向は、今日のソフトウェア開発手法の主流の 1 つであり、データとデータ操作手法を相互に依存する全体、つまりオブジェクトとしてまとめます。類似したオブジェクト、つまりクラスの共通の機能を抽象化します。クラス内のデータのほとんどは、このクラスのメソッドでのみ処理できます。このクラスは単純な外部インターフェイスを通じて外の世界に関係し、オブジェクトはメッセージを通じて通信します。プログラムの流れは使用時にユーザーが決定します。例えば、抽象的な観点から見ると、人間には身長、体重、年齢、血液型などの特別な名前があり、人間は働き、直立して歩き、食事をし、自分の頭を使って道具を作ることができます。存在しない存在ではあるが、人間集団の属性や方法を持ったすべての物体を人と呼び、この対象者は現実に存在する存在であり、誰もが人間集団の対象である。

プロセス指向とは、イベント中心の開発手法であり、上から下へ順番に実行され、徐々に洗練されていくもので、プログラム構造は機能ごとにいくつかの基本モジュールに分割され、これらのモジュールがツリー構造を形成しています。モジュールは比較的単純で、機能的にも比較的独立しています 各モジュールは一般にシーケンス、選択、ループの 3 つの基本構造で構成されます モジュール化の具体的な実装方法はサブルーチンを使用することであり、プログラムの流れはプログラムを書くときに決定されますたとえば、バックギャモンのプロセス指向の設計思想は、まず問題のステップを分析することです: 第 1 ステップ、ゲームの開始、第 2 ステップ、黒い石が最初に動きます、第 3 ステップ、絵を描きます、第 4 ステップ、ステップ 勝敗を判断する; ステップ 5、白の番です; ステップ 6、絵を描く; ステップ 7、勝敗を決定する; ステップ 8、ステップ 2 に戻る; ステップ 9、最終結果を出力します。上記の各ステップを個別の機能で実装するのが、プロセス指向の開発手法です。

具体的には、両者は主に以下の点で異なります。
1) 出発点が違います。 オブジェクト指向とは、従来の思考方法を使用して客観的な世界の問題に対処することであり、問​​題領域のキーポイントをオブジェクトおよびオブジェクト間のインターフェイスに直接マッピングすることを強調します。プロセス指向の場合はそうではなく、プロセスの抽象化とモジュール化を重視し、プロセスを中心として客観的な世界の問題を構築したり処理したりします。
2) 階層的な論理関係が異なります。 オブジェクト指向手法は、オブジェクトのコレクション クラスを問題処理の基本単位として使用し、コンピューター ロジックを使用して客観的な世界の物理的存在をシミュレートし、コンピューターの世界を可能な限り客観的な世界に近づけようとします。 、問題の処理をより明確にすることができます。オブジェクト指向の方法では、クラス階層を使用して、クラス間の継承と発展を直接反映します。プロセス指向の問題処理手法の基本単位は、プロセスを明確かつ正確に表現できるモジュールであり、モジュールの階層構造は、モジュール間の関係や機能、および対象世界の問題を要約するために使用されます。コンピュータで処理できるプロセスに抽象化されます。
3) データ処理方式は制御プログラム方式とは異なります。 オブジェクト指向のメソッドは、データと対応するコードを全体にカプセル化します。原理的には、他のオブジェクトがそのデータを直接変更することはできません。つまり、オブジェクトの変更は、そのオブジェクト自身のメンバー関数によってのみ完了できます。コントロールは、プログラムは「イベント駆動型」でプログラムをアクティブ化して実行します。プロセス指向方式では、プログラムを通じてデータを直接処理し、処理が完了した後に処理結果を表示することができますが、制御プログラム方式では、プログラムが設計に従って呼び出されたり返されたりするため、自由にナビゲートすることができません。制御、制御、および各モジュール間の呼び出しが呼び出されます。
4) 解析設計とコーディング変換方法は異なります。 オブジェクト指向手法は、ソフトウェアのライフサイクル全体を通して分析、設計、コーディングまでをスムーズに行うプロセスであり、分析から設計、コーディングまで一貫したモデルが使用され、シームレスな接続が実現されます。プロセス指向の手法では、ルールに従った分析、設計、コーディング間の変換を重視し、ソフトウェアのライフサイクル全体を通じて分析、設計、コーディング間のシームレスな接続を実現します。

2. オブジェクト指向の特徴は何ですか?


#オブジェクト指向の主な機能は、抽象化、継承、カプセル化、ポリモーフィズムです。

1) 抽象化。 抽象化とは、現在の目標に関連する側面に十分な注意を払うために、現在の目標に無関係なトピックの側面を無視することです。抽象化は問題全体を理解することを目的とするのではなく、問題の一部のみを選択し、当面はいくつかの詳細を省略します。抽象化には 2 つの側面があり、1 つはプロセスの抽象化、もう 1 つはデータの抽象化です。

2) 継承。 継承は、クラスを接続し、クラスの再利用を許可および促進する階層モデルであり、共通性を明確に表現する方法を提供します。オブジェクトの新しいクラスは既存のクラスから派生できます。これはクラス継承と呼ばれるプロセスです。新規クラスは元のクラスの性質を引き継いでおり、新規クラスを元のクラスの派生クラス(サブクラス)、元のクラスを新規クラスの基底クラス(親クラス)と呼びます。派生クラスは基本クラスからメソッドとインスタンス変数を継承でき、サブクラスは特別なニーズに合わせて新しいメソッドを変更または追加できます。
3) カプセル化。 カプセル化とは、目的のものをクラスに抽象化することを指し、各クラスは独自のデータとメソッドを保護します。クラスでは、信頼できるクラスまたはオブジェクトのみにデータとメソッドの操作を許可し、信頼できない情報を非表示にすることができます。
4) ポリモーフィズム。 ポリモーフィズムとは、異なるタイプのオブジェクトが同じメッセージに応答できるようにすることを指します。多態性には、パラメータ化された多態性と包含された多態性が含まれます。ポリモーフィック言語には、柔軟性、抽象化、動作共有、コード共有という利点があり、同じ名前のアプリケーション関数の問題をうまく解決できます。

3. コンストラクターとデストラクターとは何ですか?

1.コンストラクター

PHP5 より前のバージョンでは、コンストラクターの名前はクラスの名前と同じである必要があります。PHP5 以降、開発者は __construct という名前のメソッドをコンストラクターとして定義できます。コンストラクターの関数は、クラスがインスタンス化されるときに自動的に呼び出されるため、コンストラクターは主に初期化作業を行うために使用されます。コンストラクターの名前として __construct を使用する利点の 1 つは、クラス名を変更するときにコンストラクターの名前を変更する必要がないことです。その宣言形式は
void __construct ([mixed $args [, $... ]] )

C 言語では、サブクラスのコンストラクターは親クラスのパラメーターのない関数を暗黙的に呼び出します。コンストラクタ。ただし、PHP では、サブクラスのコンストラクターは親クラスのコンストラクターを暗黙的に呼び出すことはできないため、開発者はparent::__construct() を通じて親クラスのコンストラクターを明示的に呼び出す必要があります。サブクラスがコンストラクターを定義していない場合、親クラスのコンストラクターを継承しますが、前提として親クラスのコンストラクターをprivateとして定義することはできません。使用例は次のとおりです。

<?php    
    class BaseClass {
        function __construct() {
            print "Base constructor\n";
        }
    }
    class SubClass extends BaseClass {
        function __construct() {
            parent::__construct();
            print "Sub constructor\n";
        }
    }
    // 会调用父类构造函数
    $obj = new BaseClass();
    //调用子类构造函数,子类构造函数会去调用父类构造函数
    $obj = new SubClass();
?>

プログラムの実行結果は

です。
Base constructor
Base constructor
Sub constructor

从上面的讲解中可以发现,从PHP5开始多了一种构造函数定义的方法。为了实现不同版本PHP代码的兼容,在PHP5的类中找不到 __construct() 函数并且也没有从父类继承一个的话,那么它就会尝试寻找旧式的构造函数(与类同名的函数)。这种兼容的方法存在一个风险:在PHP5之前的版本中开发的类中已有一个名为 __construct() 的方法却被用于其他用途时,PHP5的类会认为这是一个构造函数,从而当类实例化时自动执行这个方法。
从 PHP 5.3.3 开始,在命名空间中,与类名同名的方法不再作为构造函数。这一改变不影响不在命名空间中的类。

2.析构函数

析构函数是在PHP5引入的,它的作用与调用时机和构造函数刚好相反,它在对象被销毁时自动执行。析构函数__destruct()结构形式如下:

function __destruct(){
    /* 类的初始化代码*/
}

需要注意的是,析构函数是由系统自动调用的,因此,它不需要参数。
默认情况下,系统仅释放对象属性所占用的内存,并不销毁在对象内部申请的资源(例如,打开文件、创建数据库的连接等),而利用析构函数在使用一个对象之后执行代码来清除这些在对象内部申请的资源(关闭文件、断开与数据库的连接)。
与构造函数类似,如果想在子类中调用父类的析构函数,那么需要显式地调用:parent::__destruct()。如果子类没有定义析构函数,那么它会继承父类的析构函数。
当对象不再被引用时,将调用析构函数。如果要明确地销毁一个对象,那么可以给指向对象的变量不分配任何值,通常将变量赋值为NULL或者用unset()函数。示例代码如下:

<?php 
    class des{
        function __destruct(){
            echo "对象被销毁,执行析构函数<br>";
        }
    }
    $p=new des(); /* 实例化类 */
    echo "程序开始<br>";
    unset($p); /* 销毁变量$p */
    echo "程序结束";
?>

四、面向对象的作用域范围有哪几种?

在PHP5中,类的属性或者方法主要有public、protected和private三种类作用域,它们的区别如下:
1)public(公有类型)表示全局,类内部、外部和子类都可以访问。
默认的访问权限为public,也就是说,如果一个方法没有被public、protected或private修饰,那么它默认的作用域为public。
2)protected(受保护类型)表示受保护的,只有本类或子类可以访问。
在子类中,可以通过self::var或self::method访问,也可以通过parent::method来调用父类中的方法。
在类的实例化对象中,不能通过$obj->var来访问protected类型的方法或属性。
3)private(私有类型)表示私有的,只有本类内部可以使用。
该类型的属性或方法只能在该类中使用,在该类的实例、子类、子类的实例中都不能调用私有类型的属性和方法。


以上がPHP 面接のためのオブジェクト指向の知識の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。