PHP面向对象中的重要知识点(一)
1. __construct:
内置构造函数,在对象被创建时自动调用。见如下代码:
<?php
class ConstructTest {
private $arg1;
private $arg2; public function __construct($arg1, $arg2) {
$this->arg1 = $arg1;
$this->arg2 = $arg2;
print "__construct is called...\n";
}
public function printAttributes() {
print '$arg1 = '.$this->arg1.' $arg2 = '.$this->arg2."\n";
}
}
$testObject = new ConstructTest("arg1","arg2");
$testObject->printAttributes();
运行结果如下:
Stephens-Air:Desktop$ php Test.php
__construct is called...
$arg1 = arg1 $arg2 = arg2
2. parent:
用于在子类中直接调用父类中的方法,功能等同于Java中的super。
<?php
class BaseClass {
protected $arg1;
protected $arg2; function __construct($arg1, $arg2) {
$this->arg1 = $arg1;
$this->arg2 = $arg2;
print "__construct is called...\n";
}
function getAttributes() {
return '$arg1 = '.$this->arg1.' $arg2 = '.$this->arg2;
}
} class SubClass extends BaseClass {
protected $arg3; function __construct($baseArg1, $baseArg2, $subArg3) {
parent::__construct($baseArg1, $baseArg2);
$this->arg3 = $subArg3;
}
function getAttributes() {
return parent::getAttributes().' $arg3 = '.$this->arg3;
}
}
$testObject = new SubClass("arg1","arg2","arg3");
print $testObject->getAttributes()."\n";
运行结果如下:
Stephens-Air:Desktop$ php Test.php
__construct is called...
$arg1 = arg1 $arg2 = arg2 $arg3 = arg3
3. self:
在类内调用该类静态成员和静态方法的前缀修饰,对于非静态成员变量和函数则使用this。
<?php
class StaticExample {
static public $arg1 = "Hello, This is static field.\n";
static public function sayHello() {
print self::$arg1;
}
} print StaticExample::$arg1;
StaticExample::sayHello();
运行结果如下:
Stephens-Air:Desktop$ php Test.php
Hello, This is static field.
Hello, This is static field.
4. static:
这里介绍的static关键字主要用于PHP 5.3以上版本新增的延迟静态绑定功能。请看一下代码和关键性注释。
<?php
abstract class Base {
public static function getInstance() {
//这里的new static()实例化的是调用该静态方法的当前类。
return new static();
}
abstract public function printSelf();
} class SubA extends Base {
public function printSelf() {
print "This is SubA::printSelf.\n";
}
} class SubB extends Base {
public function printSelf() {
print "This is SubB::printSelf.\n";
}
} SubA::getInstance()->printSelf();
SubB::getInstance()->printSelf();
运行结果如下:
Stephens-Air:Desktop$ php Test.php
This is SubA::printSelf.
This is SubB::printSelf.
static关键字不仅仅可以用于实例化。和self和parent一样,static还可以作为静态方法调用的标识符,甚至是从非静态上下文中调用。在该场景下,self仍然表示的是当前方法所在的类。见如下代码:
<?php
abstract class Base {
private $ownedGroup;
public function __construct() {
//这里的static和上面的例子一样,表示当前调用该方法的实际类。
//需要另外说明的是,这里的getGroup方法即便不是静态方法,也会得到相同的结果。然而倘若
//getGroup真的只是普通类方法,那么这里还是建议使用$this。
$this->ownedGroup = static::getGroup();
}
public function printGroup() {
print "My Group is ".$this->ownedGroup."\n";
}
public static function getInstance() {
return new static();
}
public static function getGroup() {
return "default";
}
} class SubA extends Base {
} class SubB extends Base {
public static function getGroup() {
return "SubB";
}
} SubA::getInstance()->printGroup();
SubB::getInstance()->printGroup();
运行结果如下:
Stephens-Air:Desktop$ php Test.php
My Group is default
My Group is SubB
5. __destruct:
析构方法的作用和构造方法__construct刚好相反,它只是在对象被垃圾收集器收集之前自动调用,我们可以利用该方法做一些必要的清理工作。
<?php
class TestClass {
function __destruct() {
print "TestClass destructor is called.\n";
}
} $testObj = new TestClass();
unset($testObj);
print "Application will exit.\n";
运行结果如下:
Stephens-Air:Desktop$ php Test.php
TestClass destructor is called.
Application will exit.
6. __clone:
在PHP 5之后的版本中,对象之间的赋值为引用赋值,即赋值后的两个对象将指向同一地址空间,如果想基于对象赋值,可以使用PHP提供的clone方法。该方法将当前对象浅拷贝之后的副本返回,如果想在clone的过程中完成一些特殊的操作,如深拷贝,则需要在当前类的声明中实现__clone方法,该方法在执行clone的过程中会被隐式调用。另外需要格外注意的是,__clone方法是作用再被拷贝的对象上,即赋值后的对象上执行。
<?php
class InnerClass {
public $id = 10;
public function printSelf() {
print '$id = '.$this->id."\n";
}
} class OuterClass {
public $innerClass;
public function __construct() {
$this->innerClass = new InnerClass();
}
public function __clone() {
$this->innerClass = clone $this->innerClass;
print "__clone is called.\n";
}
} $outerA = new OuterClass();
print "Before calling to clone.\n";
$outerB = clone $outerA;
print "After calling to clone.\n";
$outerA->innerClass->id = 20;
print "In outerA: ";
$outerA->innerClass->printSelf();
print "In outerB: ";
$outerB->innerClass->printSelf();
运行结果如下:
Stephens-Air:Desktop$ php Test.php
Before calling to clone.
__clone is called.
After calling to clone.
In outerA: $id =
In outerB: $id =
7. const:
PHP5可以在类中定义常量属性。和全局常量一样,一旦定义就不能改变。常量属性不需要像普通属性那样以$开头,按照惯例,只能用大写字母来命名常量。另外和静态属性一样,只能通过类而不能通过类的实例访问常量属性,引用常量时同样也不需要以$符号作为前导符。另外常量只能被赋值为基础类型,如整型,而不能指向任何对象类型。
<?php
class TestClass {
const AVAILABLE = 0;
} print "TestClass::AVAILABLE = ".TestClass::AVAILABLE."\n";
运行结果如下:
0Stephens-Air:Desktop$ php Test.php
TestClass::AVAILABLE =
注:该Blog中记录的知识点,是在我学习PHP的过程中,遇到的一些PHP和其他面向对象语言相比比较特殊的地方,或者是对我本人而言确实需要簿记下来以备后查的知识点。虽然谈不上什么深度,但还是希望能与大家分享。
PHP面向对象中的重要知识点(一)的更多相关文章
- PHP面向对象中的重要知识点(三)
1. namespace: 和C++中的名字空间很像,作用也一样,都是为了避免在引用较多第三方库时而带来的名字冲突问题.通过名字空间,即便两个class的名称相同,但是因为位于不同的名字空间内,他们仍 ...
- PHP面向对象中的重要知识点(二)
1. __toString: 当对象被打印时,如果该类定义了该方法,则打印该方法的返回值,否则将按照PHP的缺省行为输出打印结果.该方法类似于Java中的toString(). <?php cl ...
- Python面向对象:杂七杂八的知识点
为什么有这篇"杂项"文章 实在是因为python中对象方面的内容太多.太乱.太杂,在写相关文章时比我所学过的几种语言都更让人"糟心",很多内容似独立内容.又似相 ...
- 第35节:Java面向对象中的多线程
Java面向对象中的多线程 多线程 在Java面向对象中的多线程中,要理解多线程的知识点,首先要掌握什么是进程,什么是线程?为什么有多线程呢?多线程存在的意义有什么什么呢?线程的创建方式又有哪些?以及 ...
- JS中面向对象中的继承(常用写法)---核心部分
1.基本概念 子类继承父类,但是不能影响父类.包括1.混合继承(构造函数+原型) 2.ES6新增class的继承. 接下来介绍,面向对象中继承的两种常用写法.即混合继承(构造函数+原型)和class继 ...
- php面向对象中static静态属性和静态方法的调用
这篇文章主要介绍了php面向对象中static静态属性和静态方法的调用,实例分析了static静态属性和静态方法的原理与调用技巧,需要的朋友可以参考下 本文实例讲述了php中static静态属性和静态 ...
- PHP面向对象中常用的关键字和魔术方法
PHP面向对象中常用的关键字 final 1.final不能修饰成员属性(类中常量不是用这个关键字) 2.final只能修饰类和方法 作用: 使用fi ...
- 文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式
本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述, ...
- PHP 面向对象中常见关键字使用(final、static、const和instanceof)
PHP 面向对象中常见关键字的使用: 1.final :final关键字可以加在类或者类中方法之前,但是不能使用final标识成员属性. 作用: 使用final标识的类,不能被继承. 在类中使用fin ...
随机推荐
- Swift让编程更简单 人人都是开发者
全称为苹果全球开发者大会的WWDC,每年的这个时候,都会如这段时间前后所举行的Google I/O 和微软的BUILD开发者会议一样,吸引全球科技媒体的目光.近几年来,因为在会上爆的猛料越来越多,“开 ...
- Java日期格式化及其使用例子收集
1 SimpleDateFormat担当重任,怎样格式化都行 import java.util.Date; import java.text.SimpleDateFormat; public clas ...
- linux指令之文件的创建、查询、修改
mkdir(make directory) 功能:创建目录 案例: mkdir test 点评:将创建一个目录名为test的目录 rmdir(remove directory) 功能:删除目录 案例: ...
- Yii2中的环境配置
默认的Debug配置 在入口文件中 defined ( 'YII_DEBUG' ) or define ( 'YII_DEBUG', true ); defined ( 'YII_ENV' ) or ...
- ASP.NET 5系列教程 (一):领读新特性
近期微软发布了ASP.NET 5.0,本次发布的新特性需求源于大量用户的反馈和需求,例如灵活的跨平台运行时和自主部署能力使ASP.NET应用不再受限于IIS.Cloud-ready环境配置降低了云端部 ...
- 谈谈final的作用
前言 一直想写写这个话题.代表公司也面试过一些求职者,每次面试我必问的两个问题之一就是“请你谈一谈对于final关键字的理解”.这是一个简单的小问题,但是不要小看它,通过对这个问题的回答以及一些简单的 ...
- GLFW初体验
GLFW - 很遗憾,没有找到FW的确切含义,Wiki上没有,GLFW主页也没有.猜测F表示for,W表示Window GLFW是干啥用的? 一个轻量级的,开源的,跨平台的library.支持Open ...
- SQL关联查询总结
employee表: department表: 笛卡儿积: 等值连接: 内连接(和等值连接效果是相同的): 外连接(外连接不仅返回满足条件的记录,还将返回不满足条件的记录)以下是左外连接,右外连接.全 ...
- 几款开源的图形化Redis客户端管理软件
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/98.html?1455870209 Redis是一个超精简的基于内存的键值 ...
- Java-数组练习5
5.从键盘上输入一个正整数n,请按照以下五行杨辉三角形的显示方式, 输出杨辉三角形的前n行.请采用循环控制语句来实现. (三角形腰上的数为1,其他位置的数为其上一行相邻两个数之和.) 1 1 1 ...