목차
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 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP의 json_encode() 함수를 사용하여 배열 또는 객체를 JSON 문자열로 변환 PHP의 json_encode() 함수를 사용하여 배열 또는 객체를 JSON 문자열로 변환 Nov 03, 2023 pm 03:30 PM

JSON(JavaScriptObjectNotation)은 웹 애플리케이션 간의 데이터 교환을 위한 일반적인 형식이 된 경량 데이터 교환 형식입니다. 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__() 함수는 Python입니다.

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이고 후자는 호출 유형 객체입니다. 그러나 사용자 정의 클래스의 인스턴스 객체의 경우 유형 객체를 호출해야만 생성할 수 있습니다. 객체를 호출할 수 있으면 해당 객체는 호출 가능하고, 그렇지 않으면 호출할 수 없습니다. 객체가 호출 가능한지 여부는 해당 유형 객체에 메서드가 정의되어 있는지 여부에 따라 결정됩니다. 좋다

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 객체를 반복하는 방법은 무엇입니까? 다음 글에서는 JS 객체 탐색 방법 5가지를 자세히 소개하고, 이 5가지 방법을 간략하게 비교해 보도록 하겠습니다.

See all articles