PHP のクラスとオブジェクトについての包括的な理解

怪我咯
リリース: 2023-03-11 20:54:01
オリジナル
1698 人が閲覧しました

ディレクトリ

PHPクラスとオブジェクト完全な分析 (1)

PHP クラスとオブジェクトの完全な分析 (2)

PHP クラスとオブジェクトの完全な分析 (3)

1. クラスとオブジェクト:実際の存在 この種のあらゆる物理的オブジェクトの個体。 $a =new User(); インスタンス化された $a

参照: PHP エイリアス、2 つの異なる変数名が同じコンテンツを指します


カプセル化: オブジェクトの

プロパティとメソッド

をクラス (論理ユニット) に編成します ) 継承:コードの再利用を目的として、元のクラスに基づいて新しいクラスを作成します。 多態性: サブクラス型のポインターを親クラス型のポインターに割り当てることができます。
------------------------------------------------

2. オブジェクトを自動的にロードする:

自動的にロードする 特別な autoload 関数を定義すると、スクリプト内で定義されていないクラスが参照されたときに、この関数が自動的に呼び出されます。

[php] view plaincopyprint?
 function autoload($class){
   require_once("classes/$class.class.php");
 }
ログイン後にコピー

なぜ autoload を使用する必要があるのか​​

1. 1 つ目は、このクラス ファイルがどこに保存されているかがわからないということです

2. このファイルをいつ使用する必要があるかがわからないということです。

3. 特にプロジェクト ファイルの数が多い場合、各ファイルの先頭に要件の長いリストを記述することは不可能です...

1 つを置き換えました

require_once ("classes/Books.class.php") ;

require_once ("classes/Employees.class.php") ;
require_once ("classes/Patrons.class.php") ;

zend が最も推奨したもの一般的な方法では、ファイル名にパスを含めます。たとえば、次の例:

[php] view plaincopyprint?

    view sourceprint?  
    // Main.class    
      
    function autoload($class_name) {     
         $path = str_replace('_', DIRECTORY_SEPARATOR, $class_name);     
         require_once $path.'.php';     
     }
ログイン後にコピー

temp = new Main_Super_Class();

上記の例では、パス内のすべてのアンダースコアが区切り文字に置き換えられます。Main/Super/Class.php ファイルに到達します。

短所:

コーディングプロセスでは、コードファイルをどこに置くべきかを明確に知っておく必要があります。

また、ファイルパスはクラス名にハードコーディングされているため、フォルダー構造を変更する必要がある場合は、次のようにする必要があります。すべてのクラス名を手動で変更します。

開発環境にいて、速度をあまり気にしない場合は、「すべて含める」メソッドを使用すると非常に便利です。

すべてのクラス ファイルを 1 つまたは複数の特定のフォルダーに配置し、トラバーサルを通じてそれらを検索してロードします。

例:

   <?php     
      
    $arr = array (     
         &#39;Project/Classes&#39;,     
        &#39;Project/Classes/Children&#39;,     
        &#39;Project/Interfaces&#39;    
     );    
      
     foreach($arr as $dir) {     
      
        $dir_list = opendir($dir);    
      
        while ($file = readdir($dir_list)) {     
             $path = $dir.DIRECTORY_SEPARATOR.$file;     
             if(in_array($file, array(&#39;.&#39;, &#39;..&#39;)) || is_dir($path))     
                 continue;    
             if (strpos($file, ".class.php"))     
                 require_once $path;     
         }     
    }     
      
     ?>
ログイン後にコピー

別の方法は、クラスファイルとその場所
設定ファイル

の間の関連付けを確立することです。例:

    view sourceprint?  
    // configuration.php           
    array_of_associations = array(     
        &#39;MainSuperClass&#39; = &#39;C:/Main/Super/Class.php&#39;,     
        &#39;MainPoorClass&#39; = &#39;C:/blablabla/gy.php&#39;    
     );
ログイン後にコピー
呼び出されるファイル
    <?php     
        require &#39;autoload_generated.php&#39;;    
        function autoload($className) {     
           global $autoload_list;     
           require_once $autoload_list[$className];     
        }    
          $x = new A();     
    ?>
ログイン後にコピー

---------- --------------------------------------

3. コンストラクターとデストラクター

PHP

構築メソッド

construct() を使用すると、クラスをインスタンス化する前にコンストラクター メソッドを実行できます。

コンストラクターはクラス内の特別なメソッドです。 new 演算子を使用してクラスのインスタンスが作成されると、コンストラクター メソッドが自動的に呼び出され、その名前はconstruct() でなければなりません。

(クラス内で宣言できるコンストラクターは 1 つだけですが、そのコンストラクターは

オブジェクトを作成する

ごとに 1 回だけ呼び出されます。このメソッドはアクティブに呼び出すことができないため、

そのため、通常はいくつかの有用な初期化タスクを実行するために使用されます。これメソッドには戻り値がありません。)関数: オブジェクトの作成時にオブジェクトを初期化するために使用されます
コンストラクターparent::construct().

デストラクター: destruct ()定義: 特別な内部メンバー関数には戻り値の型もパラメーターもありません。任意に呼び出すことはできず、オーバーロードもされません。クラス オブジェクトの寿命が終了した場合にのみ、システムが自動的に呼び出して、コンストラクターに割り当てられたリソースを解放します。

コンストラクター メソッドに対応するのは、デストラクター メソッドです。デストラクター メソッドを使用すると、ファイルを閉じる、結果セットを解放するなど、クラスを破棄する前にいくつかの操作を実行したり、いくつかの関数を完了したりできます。

デストラクターはパラメーターを取ることができず、その名前は destruct() でなければなりません。
機能: 後処理をクリーンアップします。たとえば、オブジェクトの作成時に new を使用してメモリ空間を開き、終了する前にコンストラクターに割り当てられたリソースをデストラクターを使用して解放します。

例:

    class Person {  
        public $name;  
        public $age;  
      
        //定义一个构造方法初始化赋值  
        public function construct($name,$age) {  
            $this->name=$name;  
            $this->age=$age;  
        }  
        public function say() {  
            echo "my name is :".$this->name."<br />";  
            echo "my age is :".$this->age;  
        }  
        //析构函数  
        function destruct()  
        {  
            echo "goodbye :".$this->name;  
        }  
    }  
      
    $p1=new Person("ren", 25);  
    $p1->say();
ログイン後にコピー

------------------------------------------ ----- -------------------

4.

アクセス制御

属性またはメソッドのアクセス制御は、キーワード public、protected、またはprivate infront public で定義されたクラス メンバーはどこからでもアクセスできます。 protected で定義されたクラス メンバーは、そのメンバーが存在するクラスのサブクラスおよび親クラスからアクセスできます。配置されたクラスにもアクセスできます);

プライベートとして定義されたクラス メンバーには、そのメンバーが配置されているクラスのみがアクセスできます。

クラスメンバーのアクセス制御
クラスメンバーは、キーワードpublic、protected、またはprivateを使用して定義する必要があります。

メソッドのアクセス制御
クラス内のメソッドは、キーワードpublic、protected、またはprivateを使用して定義する必要があります。これらのキーワードが設定されていない場合、メソッドはデフォルトの public に設定されます。

例:

class MyClass  
{  
    public $public = &#39;Public&#39;;  
    protected $protected = &#39;Protected&#39;;  
    private $private = &#39;Private&#39;;  
  
    function printHello()  
    {  
        echo $this->public;  
        echo $this->protected;  
        echo $this->private;  
    }  
}  
  
$obj = new MyClass();  
echo $obj->public; // 这行能被正常执行  
echo $obj->protected; // 这行会产生一个致命错误  
echo $obj->private; // 这行也会产生一个致命错误  
$obj->printHello(); // 输出 Public、Protected 和 Private
ログイン後にコピー

-------------------------------------------------------------

5 .对象继承

继承定义:以原有的类为基础,创建一个新类,从而代码复用的目的;
--------------------------------------
覆写是对象继承时用到的
重载是单对象中同方法名不同参数的方法
--------------------------------------

继承已为大家所熟知的一个程序设计特性,PHP 的对象模型也使用了继承。继承将会影响到类与类,对象与对象之间的关系。

比如,当扩展一个类,子类就会继承父类的所有公有和保护方法。但是子类的方法会覆盖父类的方法。

继承对于功能的设计和抽象是非常有用的,而且对于类似的对象增加新功能就无须重新再写这些公用的功能。

    class Person {  
        public $name;  
        public $age;  
      
        function say() {  
            echo "my name is:".$this->name."<br />";  
        echo "my age is:".$this->age;  
        }  
    }  
      
    // 类的继承  
    class Student extends Person {  
        var $school;    //学生所在学校的属性  
          
        function study() {  
            echo "my name is:".$this->name."<br />";  
            echo "my shool is:".$this->school;  
        }         
    }  
      
    $t1 = new Student();  
    $t1->name = "zhangsan";  
    $t1->school = "beijindaxue";  
    $t1->study();
ログイン後にコピー

------- --------- ------ --------- -------- -----

6 .范围解析操作符(::)

范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。
当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。

self 和 parent 这两个特殊的关键字是用于在类的内部对成员或方法进行访问的。
注意:
当一个子类覆盖其父类中的方法时,PHP 不会再执行父类中已被覆盖的方法,直到子类中调用这些方法为止

例子:

    <?php  
    class OtherClass extends MyClass  
    {  
        public static $my_static = &#39;static var&#39;;  
      
        public static function doubleColon() {  
            echo parent::CONST_VALUE . "\n";  
            echo self::$my_static . "\n";  
        }  
    }  
      
    OtherClass::doubleColon();  
    ?>
ログイン後にコピー

以上がPHP のクラスとオブジェクトについての包括的な理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート