首页 php教程 php手册 PHP面向对象精要

PHP面向对象精要

Jun 06, 2016 pm 07:54 PM
extends php 使用 实现 对象 继承 面向

1 使用extends实现继承以及重载、魔术方法的含义 class B extends A 声明的时候B里可以没有A里的方法 调用的时候$b=new B(); $b-A里的方法(); $b-A里的属性=1; $b-B里的方法(); $b-B里的方法(); 如果$a=new A(); 可以 $a-A里的方法(); $a-A里的属性=1; 不可

 

1 使用extends实现继承以及重载、魔术方法的含义

class B extends A

声明的时候B里可以没有A里的方法

调用的时候$b=new B();

$b->A里的方法();

$b->A里的属性=1;

$b->B里的方法();

$b->B里的方法();

如果$a=new A();

可以

$a->A里的方法();

$a->A里的属性=1;

不可以

$a->B里的方法();

$a->B里的方法();

 

重载:B继承A ,B里实现和A同名的方法属性。

PHP中的"重载"与其它绝大多数面向对象语言不同。传统的"重载"是用于提供多个同名的 类方法,但各方法的参数类型和个数不同。

 

魔术方法:PHP把所有以__(两个下划线)开头的类方法当成魔术方法。所以你定义自己的类方法时,不要以 __为前缀。

 

 

2 继承用private和protected访问修饰符可见性

属性方法private不可以被继承

属性方法protected类外部不可见,可以被继承

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

 

3 php中双冒号::的应用

php类代码中常看到"::"的操作符,这个是作用域限定操作符,是用一个双冒号"::"表示,它用来置顶类中不同作用域的级别。左边是作用域右边是访问作用域的成员。

在php中定义的作用域有self和parent两种(在php6中提供了static作用域)。

 

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

class MyClass {
    const 
CONST_VALUE 'A constant value';
}

echo 
MyClass::CONST_VALUE;

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();

//子类覆盖父类

class MyClass
{
    protected function 
myFunc() {
        echo 
"MyClass::myFunc()\n";
    }
}

class 
OtherClass extends MyClass
{
    
// 覆盖父类中的方法
    
public function myFunc()
    {
        
// 但仍然可以调用已被覆盖的方法
        
parent::myFunc();
        echo 
"OtherClass::myFunc()\n";
    }
}

$class = new OtherClass();
$class->myFunc();

4 php中this和self以及parent的作用

this:就是指向当前对象实例的指针,不指向任何其他对象或类。

self:表示当前类的作用域,与this不同的是它不表示类的某个特定实例,在类之外的代码中不能使用self,而且它不能识别自己在继承中层次的位置。也就是说,当在扩展类中使用self时,它调用的不是父类的方法,而是扩展类的重载的方法。self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。

private static $firstCount = 0;
        private $lastCount;

        //构造函数
         function __construct()
         {
             $this->lastCount = ++self:$firstCount; //使用self来调用静态变量,使用self调用必须使用::(域运算符号)
        }

parent:表示当前类父类的作用域,其余的跟self特性一样。parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。

//继承类的构造函数
     function __construct( $personSex, $personAge )
   {
         parent::__construct( "test" ); //使用parent调用了父类的构造函数
         $this->personSex = $personSex;
          $this->personAge = $personAge;
   }

5 构造函数与析构函数

具有构造函数的类会在每次创建对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

function __construct() {}
如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()

PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

function __destruct() {}

 

 6 final 关键字

PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为final,则不能被继承。

 

7 继承和构造函数

父类 子类 结果
有构造函数 无构造函数 父构造
有构造函数 有构造函数 子构造

 

8 接口

可以通过interface来定义一个接口,就像定义一个标准的类一样。

注意:

1)但其中定义所有的方法都是空的;

2)接口中定义的所有方法都必须是public,这是接口的特性;

3)实现多个接口时,接口中的方法不能有重名

4)接口也可以继承,通过使用extends操作符;

5)接口中也可以定义常量。接口常量和类常量的使用完全相同。 它们都是定值,不能被子类或子接口修改。

// 声明一个'iTemplate'接口
interface iTemplate
{
    public function 
setVariable($name$var);
    public function 
getHtml($template);
}

// 实现接口
// 下面的写法是正确的
class Template implements iTemplate
{
    private 
$vars = array();
  
    public function 
setVariable($name$var)
    {
        
$this->vars[$name] = $var;
    }
  
    public function 
getHtml($template)
    {
        foreach(
$this->vars as $name => $value) {
            
$template str_replace('{' $name '}'$value$template);
        }
 
        return 
$template;
    }
}

9 属性
类的变量成员叫做“属性”,属性声明是由关键字public或者protected或者private开头,然后跟一个变量来组成。 属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段时就为常数,而不是在编译阶段之后在运行阶段运算出的常数。

在PHP5 中,预定义了两个函数“__get()”和“__set()”来获
取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”。

简单的说一个是取值,一个是赋值。,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__construct())一样, 类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加://__get()方法用来获取私有属性

view plaincopy to clipboardprint?

  1. class Person{   
  2. //下面是人的成员属性    
  3. private $name//人的名字   
  4. private $sex//人的性别   
  5. private $age//人的年龄   
  6. //__get()方法用来获取私有属性    
  7. private function __get($property_name){   
  8. if(isset($this->$property_name)){   
  9. return($this->$property_name);}else {   
  10. return(NULL);   
  11. }   
  12. }   
  13. }   
  14. //__set()方法用来设置私有属性    
  15. private function __set($property_name$value){   
  16. $this->$property_name = $value;   
  17. }   
  18. //__isset()方法    
  19. private function __isset($nm){   
  20. echo "isset()函数测定私有成员时,自动调用
    "
    ;   
  21. return isset($this->$nm);   
  22. }   
  23. //__unset()方法    
  24. private function __unset($nm){   
  25. echo "当在类外部使用unset()函数来删除私有成员时自动调用的
    "
    ;   
  26. unset($this->$nm);   
  27. }   
  28. }   
  29. $p1=new Person();   
  30. $p1->name="this is a person name";   
  31. //在使用isset()函数测定私有成员时,自动调用__isset()方法帮我们完成,返回结果为true   
  32. echo var_dump(isset($p1->name))."
    "
    ;   
  33. echo $p1->name."
    "
    ;   
  34. //在使用unset()函数删除私有成员时,自动调用__unset()方法帮我们完成,删除name私有属性   
  35. unset($p1->name);   
  36. //已经被删除了, 所这行不会有输出    
  37. echo $p1->name;   
  38. ?>   


10 克隆

对象复制可以通过clone关键字来完成(如果对象中存在__clone()方法,会先被调用)。对象中的 __clone()方法不能直接调用。

当对象被复制后,PHP5会对对象的所有属性执行一个“浅复制”(shallow copy)。所有的属性中的引用 仍然不变,指向原来的变量。如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调用, 可用于修改属性的值(如果有必要的话)。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系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脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
2 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

CakePHP 项目配置 CakePHP 项目配置 Sep 10, 2024 pm 05:25 PM

在本章中,我们将了解CakePHP中的环境变量、常规配置、数据库配置和电子邮件配置。

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

为了在 cakephp4 中处理日期和时间,我们将使用可用的 FrozenTime 类。

CakePHP 文件上传 CakePHP 文件上传 Sep 10, 2024 pm 05:27 PM

为了进行文件上传,我们将使用表单助手。这是文件上传的示例。

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

在本章中,我们将学习以下与路由相关的主题?

讨论 CakePHP 讨论 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu

CakePHP 使用数据库 CakePHP 使用数据库 Sep 10, 2024 pm 05:25 PM

在 CakePHP 中使用数据库非常容易。本章我们将了解CRUD(创建、读取、更新、删除)操作。

CakePHP 创建验证器 CakePHP 创建验证器 Sep 10, 2024 pm 05:26 PM

可以通过在控制器中添加以下两行来创建验证器。

See all articles