目次
PHP 类与对象 全解析( 一)
ホームページ php教程 php手册 PHP 类与对象 全解析( 一)

PHP 类与对象 全解析( 一)

Jun 13, 2016 am 09:17 AM
物体

PHP 类与对象 全解析( 一)

1.类与对象

 

对象:实际存在该类事物中每个实物的个体。$a =new User(); 实例化后的$a

引用:php的别名,两个不同的变量名字指向相同的内容

 

封装: 把对象的属性和方法组织在一个类(逻辑单元)里

继承:以原有的类为基础,创建一个新类,从而代码复用的目的;

多态:允许将子类类型的指针赋值给父类类型的指针。

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

 

2.自动加载对象:

自动加载通过定义特殊的__autoload函数,当引用没有在脚本中定义的类时会自动调用这个函数.

 

1 [php] view plaincopyprint?

2 function __autoload($class){  

3   require_once("classes/$class.class.php");  

4 }  

为什么要使用__autoload

 

1,首先是不知道这个类文件存放在什么地方,

2,另外一个就是不知道什么时候需要用到这个文件。

3,特别是项目文件特别多时,不可能每个文件都在开始的部分写很长一串的 require …

 

 

替代了一

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

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

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

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

 

zend推荐了一种最流行的办法,在文件名中包含路径。例如下面的例子:

 

 

 

 

1 [php] view plaincopyprint?

3     view sourceprint?  

4     // Main.class    

5       

6     function __autoload($class_name) {     

7          $path = str_replace('_', DIRECTORY_SEPARATOR, $class_name);     

8          require_once $path.'.php';     

9      }    

 

 

 

temp = new Main_Super_Class();

 

所有的下划线都会被替换成路径中的分隔符,上例中就会去 Main/Super/Class.php文件。

 

缺点:

 

是在编码过程中,必须明确的知道代码文件应当所处的位置,

 

而且由于将文件路径硬编码在了类名中,如果需要修改文件夹的结构时,我们必须手工修改所有的类名。

 

如果是在一个开发环境中,并且对于速度不是很在意的话,使用'Include All’这个方法是非常方便的。

通过将所有类文件放在一个或几个特定文件夹中,然后通过遍历的方式查找加载。

例如

 

 

   

      

    $arr = array (     

         'Project/Classes',     

        'Project/Classes/Children',     

        'Project/Interfaces'    

     );    

      

     foreach($arr as $dir) {     

      

        $dir_list = opendir($dir);    

      

        while ($file = readdir($dir_list)) {     

             $path = $dir.DIRECTORY_SEPARATOR.$file;     

             if(in_array($file, array('.', '..')) || is_dir($path))     

                 continue;    

             if (strpos($file, ".class.php"))     

                 require_once $path;     

         }     

    }     

      

     ?>   

 

 

 

另外一个方法是在类文件和他的位置之间建立关联的配置文件,例如:

 

 

    view sourceprint?  

    // configuration.php     

      

    array_of_associations = array(     

        'MainSuperClass' = 'C:/Main/Super/Class.php',     

        'MainPoorClass' = 'C:/blablabla/gy.php'    

     );   

 

 

 

调用的文件

 

 

   

        require 'autoload_generated.php';    

        function __autoload($className) {     

           global $autoload_list;     

           require_once $autoload_list[$className];     

        }    

          $x = new A();     

    ?>   

 

 

 

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

 

 

3.构造函数和析构函数

 

 

PHP 构造方法 __construct() 允许在实例化一个类之前先执行构造方法。

 

构造方法是类中的一个特殊方法。当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称必须是 __construct() 。

 

(在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,

所以通常用它执行一些有用的初始化任务。该方法无返回值。)

 

作用: 用来创建对象时初始化对象

子类执行分类的构造函数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."
";  

            echo "my age is :".$this->age;  

        }  

        //析构函数  

        function __destruct()  

        {  

            echo "goodbye :".$this->name;  

        }  

    }  

      

    $p1=new Person("ren", 25);  

    $p1->say();  

 

 

 

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

 

 

4 .访问控制

 

对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的

 public 所定义的类成员可以在任何地方被访问;

 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);

 private 定义的类成员则只能被其所在类访问。 

对类成员的访问控制

 类成员都必须使用关键字public、protected 或 private 进行定义

 

对方法的访问控制

类中的方法都必须使用关键字public、protected 或 private 进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。

 

例子:

 

 

class MyClass  

{  

    public $public = 'Public';  

    protected $protected = 'Protected';  

    private $private = 'Private';  

  

    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."
";  

        echo "my age is:".$this->age;  

        }  

    }  

      

    // 类的继承  

    class Student extends Person {  

        var $school;    //学生所在学校的属性  

          

        function study() {  

            echo "my name is:".$this->name."
";  

            echo "my shool is:".$this->school;  

        }         

    }  

      

    $t1 = new Student();  

    $t1->name = "zhangsan";  

    $t1->school = "beijindaxue";  

    $t1->study();  

 

 

 

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

 

 

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

 

 

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

当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。

 

self 和 parent 这两个特殊的关键字是用于在类的内部对成员或方法进行访问的。

注意:

当一个子类覆盖其父类中的方法时,PHP 不会再执行父类中已被覆盖的方法,直到子类中调用这些方法为止

 

 

例子:

 

 

   

    class OtherClass extends MyClass  

    {  

        public static $my_static = 'static var';  

      

        public static function doubleColon() {  

            echo parent::CONST_VALUE . "\n";  

            echo self::$my_static . "\n";  

        }  

    }  

      

    OtherClass::doubleColon();  

    ?>   

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP の json_encode() 関数を使用して配列またはオブジェクトを JSON 文字列に変換する PHP の json_encode() 関数を使用して配列またはオブジェクトを JSON 文字列に変換する Nov 03, 2023 pm 03:30 PM

JSON (JavaScriptObjectNotation) は、Web アプリケーション間のデータ交換の一般的な形式となっている軽量のデータ交換形式です。 PHP の json_encode() 関数は、配列またはオブジェクトを JSON 文字列に変換できます。この記事では、PHPのjson_encode()関数の構文、パラメータ、戻り値、具体的な例などの使い方を紹介します。構文 json_encode() 関数の構文は次のとおりです。

MySQLクエリ結果の配列をオブジェクトに変換するにはどうすればよいですか? MySQLクエリ結果の配列をオブジェクトに変換するにはどうすればよいですか? Apr 29, 2024 pm 01:09 PM

MySQL クエリ結果の配列をオブジェクトに変換する方法は次のとおりです。 空のオブジェクト配列を作成します。結果の配列をループし、行ごとに新しいオブジェクトを作成します。 foreach ループを使用して、各行のキーと値のペアを新しいオブジェクトの対応するプロパティに割り当てます。新しいオブジェクトをオブジェクト配列に追加します。データベース接続を閉じます。

Python の __contains__() 関数を使用してオブジェクトの包含操作を定義する Python の __contains__() 関数を使用してオブジェクトの包含操作を定義する Aug 22, 2023 pm 04:23 PM

Python の __contains__() 関数を使用して、オブジェクトの包含操作を定義します。Python は、さまざまな種類のデータを処理するための多くの強力な機能を提供する、簡潔で強力なプログラミング言語です。その 1 つは、__contains__() 関数を定義してオブジェクトの包含操作を実装することです。この記事では、__contains__() 関数を使用してオブジェクトの包含操作を定義する方法とサンプル コードを紹介します。 __contains__() 関数は Pytho です

ソースコードの探索: Python ではオブジェクトはどのように呼び出されますか? ソースコードの探索: Python ではオブジェクトはどのように呼び出されますか? May 11, 2023 am 11:46 AM

Wedge オブジェクトは主に 2 つの方法で作成されることがわかっています。1 つは Python/CAPI を使用する方法、もう 1 つは型オブジェクトを呼び出すことによる方法です。組み込み型のインスタンス オブジェクトについては、両方のメソッドがサポートされています。たとえば、リストは [] または list() を通じて作成できます。前者は Python/CAPI で、後者は呼び出し型オブジェクトです。ただし、カスタム クラスのオブジェクトの場合は、型オブジェクトを呼び出すことによってのみ作成できます。オブジェクトを呼び出すことができる場合、そのオブジェクトは呼び出し可能ですが、それ以外の場合は呼び出し可能ではありません。オブジェクトが呼び出し可能かどうかは、対応する型オブジェクトにメソッドが定義されているかどうかによって決まります。のように

PHP における配列とオブジェクトの違いは何ですか? PHP における配列とオブジェクトの違いは何ですか? Apr 29, 2024 pm 02:39 PM

PHP では、配列は順序付けられたシーケンスであり、要素はインデックスによってアクセスされます。オブジェクトは、new キーワードによって作成されたプロパティとメソッドを持つエンティティです。配列へのアクセスはインデックス経由で、オブジェクトへのアクセスはプロパティ/メソッド経由で行われます。配列値が渡され、オブジェクト参照が渡されます。

Javascriptオブジェクトの5つのループトラバースメソッドを詳しく解説 Javascriptオブジェクトの5つのループトラバースメソッドを詳しく解説 Aug 04, 2022 pm 05:28 PM

Javascript オブジェクトをループするにはどうすればよいですか?次の記事では、5 つの JS オブジェクト走査方法を詳しく紹介し、これら 5 つの方法を簡単に比較します。

Python の __le__() 関数を使用して、2 つのオブジェクトの小なり等しい比較を定義します。 Python の __le__() 関数を使用して、2 つのオブジェクトの小なり等しい比較を定義します。 Aug 21, 2023 pm 09:29 PM

タイトル: Python の __le__() 関数を使用して 2 つのオブジェクト以下の比較を定義する Python では、特別なメソッドを使用してオブジェクト間の比較演算を定義できます。その 1 つは __le__() 関数で、以下の比較を定義するために使用されます。 __le__() 関数は Python のマジック メソッドであり、「以下」演算を実装するために使用される特別な関数です。小なり等しい演算子 (<=) を使用して 2 つのオブジェクトを比較すると、Python

PHP の Request オブジェクトとは何ですか? PHP の Request オブジェクトとは何ですか? Feb 27, 2024 pm 09:06 PM

PHP の Request オブジェクトは、クライアントからサーバーに送信される HTTP リクエストを処理するために使用されるオブジェクトです。 Request オブジェクトを通じて、リクエストを処理して応答するために、リクエスト メソッド、リクエスト ヘッダー情報、リクエスト パラメータなどのクライアントのリクエスト情報を取得できます。 PHP では、$_REQUEST、$_GET、$_POST などのグローバル変数を使用して、要求された情報を取得できますが、これらの変数はオブジェクトではなく配列です。リクエスト情報をより柔軟かつ便利に処理するために、次のことができます。

See all articles