目录
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 Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

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()函数的语法如下:st

使用Python的__contains__()函数定义对象的包含操作 使用Python的__contains__()函数定义对象的包含操作 Aug 22, 2023 pm 04:23 PM

使用Python的__contains__()函数定义对象的包含操作Python是一种简洁而强大的编程语言,提供了许多强大的功能来处理各种类型的数据。其中之一是通过定义__contains__()函数来实现对象的包含操作。本文将介绍如何使用__contains__()函数来定义对象的包含操作,并且给出一些示例代码。__contains__()函数是Pytho

如何将 MySQL 查询结果数组转换为对象? 如何将 MySQL 查询结果数组转换为对象? Apr 29, 2024 pm 01:09 PM

将MySQL查询结果数组转换为对象的方法如下:创建一个空对象数组。循环结果数组并为每一行创建一个新的对象。使用foreach循环将每一行的键值对赋给新对象的相应属性。将新对象添加到对象数组中。关闭数据库连接。

源码探秘:Python 中对象是如何被调用的? 源码探秘:Python 中对象是如何被调用的? May 11, 2023 am 11:46 AM

楔子我们知道对象被创建,主要有两种方式,一种是通过Python/CAPI,另一种是通过调用类型对象。对于内置类型的实例对象而言,这两种方式都是支持的,比如列表,我们即可以通过[]创建,也可以通过list(),前者是Python/CAPI,后者是调用类型对象。但对于自定义类的实例对象而言,我们只能通过调用类型对象的方式来创建。而一个对象如果可以被调用,那么这个对象就是callable,否则就不是callable。而决定一个对象是不是callable,就取决于其对应的类型对象中是否定义了某个方法。如

PHP 函数如何返回对象? PHP 函数如何返回对象? Apr 10, 2024 pm 03:18 PM

PHP函数可以通过使用return语句后跟对象实例来返回对象,从而将数据封装到自定义结构中。语法:functionget_object():object{}。这允许创建具有自定义属性和方法的对象,并以对象的形式处理数据。

使用Python的__le__()函数定义两个对象的小于等于比较 使用Python的__le__()函数定义两个对象的小于等于比较 Aug 21, 2023 pm 09:29 PM

标题:使用Python的__le__()函数定义两个对象的小于等于比较在Python中,我们可以通过使用特殊方法来定义对象之间的比较操作。其中之一就是__le__()函数,它用于定义小于等于比较。__le__()函数是Python中的一个魔法方法,并且是一种用于实现“小于等于”操作的特殊函数。当我们使用小于等于运算符(<=)比较两个对象时,Python

数组和对象在 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种方法,希望对大家有所帮助!

See all articles