OOP面向对象学习笔记(2)---基础实践

一:构造函数与析构函数

  1. 构造函数:在类被实例化时自动调用的一个函数。主要用来初始化。
  2. 析构函数:程序运行结束时(或者对象被销毁时)自动调用的最后一个函数。主要用来释放资源等。
  3. code next...
 1 <?php
 2 class Test {
 3     public function __construct($obj) {
 4         echo "hello " . $obj . "<br>";
 5     }
 6     public function __destruct() {
 7         echo "bye Test<br>";
 8     }
 9 }
10 $obj1 = new Test ( "obj1" );
11 $obj2 = new Test ( "obj2" );
12 // 在脚本运行结束时自动调用析构函数
13 // 输出:hello obj1 hello obj2 bye Test bye Test
14 // 在对象销毁时,不用等到脚本运行结束,自动调用析构函数
15 $obj3 = new Test ( "obj3" );
16 $obj3 = null;
17 $obj4 = new Test ( "obj4" );
18 //输出 hello obj3 bye Test hello obj4 bye Test

二:对象的引用

$james1=&$james 此时$james1和$james同时指向变量的地址。

比喻:$james1和$james是同一个人,只是不同的名字(大名、小名)。

$james1是$james的影子。

三:静态成员

1:为什么要使用静态成员?

为的是让一个类的所有对象都共用这个公共的对象,而不是这个成员属于这个类的某个对象。

举例:所有的NBA球员都有一个总裁lio,现要更换总裁为david,如何实现呢?下面的方法可以。

 1 <?php
 2 class Player{
 3     public $president="lio";
 4     public function changePresident($pName){
 5         $this->president=$pName;
 6     }
 7 }
 8 $jordan=new Player();
 9 $james=new Player();
10 $jordan->changePresident("tomacs");
11 $james->changePresident("david");
12 echo "jame‘s president is ".$james->president."<br>";
13 echo "jordan‘s president is ".$jordan->president."<br>";
14 //输出:jame‘s president is david
15 //     jordan‘s president is tomacs

显然,james和jordan对象可以使用这个方法随意的更改总裁,这样两者就不能实现共有一个总裁了。

我们可以通过静态成员的额方法实现,将方法变成全局的,不属于某一个对象。

 1 <?php
 2 class Player{
 3     public static $president="lio";
 4     public static function changePresident($pName){
 5         self::$president=$pName;
 6     }
 7 }
 8 $jordan=new Player();
 9 $james=new Player();
10 Player::changePresident("tomacs");
11 Player::changePresident("david");
12 echo "jame‘s president is ".Player::$president."<br>";
13 echo "jordan‘s president is ".Player::$president."<br>";
14 //输出:jame‘s president is david
15 //     jordan‘s president is david

四:魔术方法(PHP特有)

1:__toString() 和 __invoke()

 1 <?php
 2 class Test{
 3     //当对象被当做字符串调用时,会自动执行此方法
 4     public function __toString(){
 5         //注意,一定要有return
 6         return "hello,this is string!";
 7     }
 8     //当对象被当做函数调用时,会自动执行此方法
 9     public function __invoke(){
10         echo "hello,this is invoke!";
11     }
12
13 }
14 $obj=new Test();
15 echo $obj;     //hello,this is string!
16 $obj();        //hello,this is invoke!

2:__call() 方法重载

 1 <?php
 2 class Test{
 3     //当类的方法不存在时自动调用此函数
 4     public function __call($name,$arg){
 5         //implode()将数组转换为字符串
 6         echo "function ". $name ." with param ".implode("---", $arg);
 7     }
 8
 9 }
10 $obj=new Test();
11 $obj->test(1,2,3);//function test with param 1---2---3

延伸:__callstatic()

 1 <?php
 2 class Test{
 3     //当类的方法不存在时自动调用此函数
 4     public static function __callstatic($name,$arg){
 5         //implode()将数组转换为字符串
 6         echo "function ". $name ." with param ".implode("---", $arg);
 7     }
 8
 9 }
10 Test::test(1,2,3);//function test with param 1---2---3

3:__get()、__set()、__isset()、__unset() 属性重载

 1 <?php
 2 class Test {
 3     private $user="lio";
 4     //当对象访问不可访问属性时自动调用此函数
 5     public function __get($name) {
 6         echo "property ".$name." is denied to access.<br>";
 7     }
 8     //当对象为不可赋值属性赋值时,自动调用此方法
 9     public function __set($name,$value){
10         echo "you can not set property ".$name." to value ".$value."<br>";
11     }
12     //当对不可访问属性使用isset()时,自动调用此方法
13     public function __isset($name){
14         var_dump(isset($this->$name));
15     }
16     //当对不可访问属性使用unset()时,自动调用此方法
17     public function __unset($name){
18         unset($this->$name);
19     }
20 }
21 $obj=new Test();
22 $obj->user;           //property user is denied to access.
23 $obj->user="eric";    //you can not set property user to value eric
24 isset($obj->user);    //bool(true)
25 unset($obj->user);

4:__clone()对象克隆

首先明白“克隆”。比如A克隆出B来,则A和B完全相同,但是A和B是两个独立的主体,对象。

举例:现有对象$obj1,如果$obj2=$obj1 ,那么$obj1和$obj2指向同一个对象,不是两个相同的主体。

解决:可以通过$obj2=clone $obj1 解决。那么$obj1和$obj2就是两个独立的主体了。

问题:如果$obj2想对$obj1变异,怎么办呢?

 1 <?php
 2 class Test {
 3     public $user="lio";
 4     //进行变异
 5     public function __clone(){
 6          return $this->user="eric";
 7     }
 8 }
 9 $obj1=new Test();
10 $obj2=clone $obj1;
11 echo $obj1->user; //lio
12 echo $obj2->user; //eric
时间: 2024-10-09 03:01:36

OOP面向对象学习笔记(2)---基础实践的相关文章

OOP面向对象学习笔记(1)---基础概念

一:什么是对象? 世间万物皆对象,包括有形的和无形的. 二:对象的组成是什么? 元素:是对象的数据模型,用于描述对象.如一个人(对象)的年龄,身高等等. 行为:是对象的行为模型,用于描述对象做什么.如一个人(对象)可以吃饭.学习等等. 三:什么是面向对象编程? 在编程的时候数据结构都通过对象的方式进行存储. 四:为什么使用面向对象? 对象的描述方式更加贴合真实世界,有利于大型业务的理解,使我们思路开阔. 能够对代码进行更好地复用,精简代码. 五:面向对象的实质? 把要解决的问题都用对象的方式解决

Java快速教程--vamei 学习笔记(基础篇)

链接:http://www.cnblogs.com/vamei/archive/2013/03/31/2991531.html java快速教程第1课 从HelloWorld到面向对象 学习网址:http://www.cnblogs.com/vamei/archive/2013/03/14/2958654.html java快速教程第2课 方法与数据成员 学习网址:http://www.cnblogs.com/vamei/archive/2013/03/25/2964430.html java快

面向对象学习笔记

abstract:抽象类或方法的关键字注意事项:一个类中至少有一个抽象方法不允许有大括号主要意义就是规范方法,要求必须按照抽象中的方法来写继承抽象类的类,必须重载完全抽象类的方法抽象类是不能被实例化的,因为本身没有意义 extends 继承的关键字 类中常用的关键字:final 被定义的类不能被继承,该类的方法不能被继承,相当于一个锁的功能self self::静态成员,相当于类名称::静态成员,和this是有区别的,$this访问类中的内容必须实例化,而self是直接可以访问类中的内容的,多用

C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字节的值,该如何在它上面调用方法? 二:值类型转换为引用类型--装箱 2.1CLR对值类型进行装箱时:新分配托管堆内存,将值类型的实例字段拷贝到新分配的内存中,返回托管堆中新分配对象的地址.这个地址就是一个指向对象的引用. int i = 10; Object obj = i; 三:将引用类型转换为值

[Golong]学习笔记(一) 基础知识

Go编程基础 Go的内置关键字(25个) 不多 break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continute for import return var Go的注释方法(和js一样) 单行注释: // 多行注释: /**/ Go程序一般结构 common_structure.go 通过 pack

01-Python学习笔记-基础语法

Python标识符 -d           在解析时显示调试信息 -O           生成优化代码 ( .pyo 文件 ) -S           启动时不引入查找Python路径的位置 -v            输出Python版本号 -X           从 1.6版本之后基于内建的异常(仅仅用于字符串)已过时. -c cmd     执行 Python 脚本,并将运行结果作为 cmd 字符串. file           在给定的python文件执行python脚本. P

Php面向对象学习笔记 – 构造、析构、对象赋值、克隆

Php面向对象学习笔记 – 构造.析构.对象赋值.克隆 class student { public  $stu_id;       // 定义成员变量 public  $stu_name; public  function sayName()   // 成员函数 { echo $this->stu_name;   // $this  访问该对象的成员变量 } } $stu = new  Student;      // 创建对象 $stu->stu_id = '0607001'; $stu-

PHP:学习笔记(2)——基础语法

PHP:学习笔记(2)--基础语法 向屏幕输出 说明 1.void echo ( string $arg1 [, string $... ] ) 2.int print ( string $arg ) 注意: 1.echo.print 实际上不是一个函数(它是一个语言结构),因此你可以不必使用圆括号来括起它的参数列表. 2.输出变量的时候需要使用双引号! 3.int printf ( string $format [, mixed $args [, mixed $... ]] ) 4.strin

javascript面向对象学习笔记(二)——创建对象

javascript面向对象学习笔记(二)--创建对象 工厂模式 该模值抽象了创建具体对象de过程.用函数来封装噫特定接口创建对象的细节. function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return o; } var person1=createPerson("Chiaki&