PHP中如何定义类及其成员属性与操作
1、类的定义:
i. 类的关键字定义使用class
1.定义一个空类
Class Person{};
2.定义一个有成员属性和操作的类
Class Person{
成员属性........
操 作........
}
3.定义一个不能被继承的类,使用final关键字
Final class Person{
成员属性........
操 作........
}
4.注意:final关键字不能用来修饰成员属性 ,只能修饰类和方法(final方法后面介绍)
5.这里举一个带有final的class
定义一个final的类FinalClass,包含一个公共函数
final class FinalClass {
public function ffun() {
echo “本类为final类”;
}
}
定义一个类ChildFinalClass 并继承FinalClass 类
class ChildFinalClass extends FinalClass {
public function fchildfun() {
echo ‘本类继承final类FinalClass ’;
}
}
这样当执行以上命令的时候系统会提示
Fatal error: Class ChildFinalClass may not inherit from final class (FinalClass)
证明由final关键字定义的class是不可以被子类继承的
2、类中成员属性的定义
i. 成员属性就是对该类定义的一些变量属性,那人作为一个类来说,人都有一对眼睛(正常的啊,二郎神除外),一张嘴,两个耳朵,等这样的一些固定的用来描述或表现某种事物的专有名词称为成员属性
ii. 类中成员属性的声明使用的关键字
iii. 常见成员属性声明是由关以下键字
public,var,protected,private开头的,然后跟一个变量来组成的。还有一些成员属性包括,静态static,常量const.
Public: 表示全局的,类内部外部子类都可以访问
Var: php 5 版本中会认为这个成员属性为public类型的属性
protected 表示受保护的,只有本类或子类或父类中可以访问
private
表示私有的,只有本类内部可以使用
Static: 1)静态的属性,
2)用static修饰的成员属性可以被同一个类的所有对象共享
3) 静态的数据是在类第一次被加载的时候就存在了内存中的数据段中(初始化静态段)
4)类中使用self::成员属性名
5)类外 类名::成员属性名
Const: 1)类中常量属性,在类中声明常量必须使用const
2)类中使用 self::成员属性名
3)类外使用 类名::成员属性名
注意:属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段时就为常数,而不是在编译阶段之后在运行阶段运算出的常数。例如,不能包含任何运算符,不能是任何变量,不能是一个函数等。
iv. 成员属性的调用方式:
在类的成员方法里面,可以通过 $this->property(property是属性名字)这种方式来访问类的属性、
方法,但是要访问类的静态属性或者在静态方法里面却不能使用,而是使用 self::$property。 在类的非静态方法里面可以使用伪变量
$this,这个伪变量是调用该方法的实例化对象引用。
接下来用代码对上面的内容做一下解释:
class FinalClass {
//static $a = strTolower();
//这种写法错误
//const A = 1+2; //这种写法错误
//public $name = 123+456;
//这种写法错误
static $a = '$a';
const A = 'A';
public $name = '凤姐';
protected $sex = '男+女';
private $age = 23;
}
class ChildFinalClass extends FinalClass{
public function fchildfun(){
echo 'ChildFinalClass类中ChildFinalClass::$a->'.ChildFinalClass::$a."<hr>";
Echo 'ChildFinalClass类中ChildFinalClass::A->'.ChildFinalClass::A."<hr>";
echo '大家好,我叫'.$this->name."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
//由于age是私有的成员属性,所以在这里将不会被调用,将提示没有定义此属性在ChildFinalClass类中。
}
}
$obj = new ChildFinalClass();
$obj->fchildfun();
3、类中操作的定义
i. 我本人一般喜欢叫操作为成员方法,以下我会叫操作为方法其实都是一样的
ii. 成员方法的定义:成员方法就是对该类定义的一些函数方法,比如拿这个类来例句例子,人能吃饭,能跑步,能敲代码,这就是成员方法。也就是可以做一些可执行性的动作我们理解为成员方法
iii. 成员方法的访问和成员属性一样可以参照上面成员属性的访问介绍。
iv. 成员方法和成员属性一样也包括public,protected,private,static,final并且作用域也是一样的,接下来举一些例子供大家参考和理解。
v. 静态的成员方法只能访问静态的成员属性和成员方法,并且类内部访问静态方法可以使用self::静态方法(), 类外部访问使用类名::静态方法()
1. 自定义方法:
class FinalClass {
static $a = '$a';
const A = 'A';
public $name = '凤姐';
protected $sex = '男+女';
private $age = 23;
//定义一个公共方法
public function publickfun(){
echo 'FinalClass类中self::$a->'.self::$a."<hr>";
echo "FinalClass类中self::A->".self::A."<hr>";
echo '大家好,我叫:'.$this->name."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
}
//定义一个受保护的方法
protected function protectedfun(){
echo 'FinalClass类中self::$a->'.self::$a."<hr>";
echo "FinalClass类中self::A->".self::A."<hr>";
echo '大家好,我叫:'.$this->name."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
}
//定义一个私用方法
private function privatefun(){
echo 'FinalClass类中self::$a->'.self::$a."<hr>";
echo "FinalClass类中self::A->".self::A."<hr>";
echo '大家好,我叫:'.$this->name."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
}
}
class ChildFinalClass extends FinalClass{
public function fchildfun(){
echo 'ChildFinalClass类中ChildFinalClass::$a->'.ChildFinalClass::$a."<hr>";
Echo 'ChildFinalClass类中ChildFinalClass::A->'.ChildFinalClass::A."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
//由于age是私有的成员属性,可以理解为我不想让别人知道我的年龄,所以在这里将不会被调用,将提示没有定义此属性在ChildFinalClass类中。
$this->publickfun();
$this->protectedfun();
$this->privatefun();
//由于privatefun是私有的成员方法,所以在这里将不会被调用。
}
}
$obj = new ChildFinalClass();
$obj->fchildfun();
2.魔术方法
i. 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此
ii. 从PHP
5以后的版本,PHP中的类就可以使用魔术方法了。其规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是
为了重载已有的魔术方法,接下来列出一些魔术方法,如果大家想详细了解可以针对某一个进行查询了解,这里就不大篇幅的介绍了。
1、__construct() 构造方法
__destruct()
析构方法
2、__clone()
如果想复制一个对象则需要使用clone方法
3、__toString()
方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时
4、__sleep() 串行化的时候用
__wakeup 反串行化的时候调用
5、 __set_state()
当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)
6、__invoke(PHP 5.3.0以上版本有效)
当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
7、__callStatic(PHP 5.3.0以上版本有效) 是为了处理静态方法调用
8、__get() 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名。
__set() 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。 这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。
9、__isset() 当在一个未定义的属性上调用isset()函数时调用此方法
__unset() 当在一个未定义的属性上调用unset()函数时调用此方法
10、__call( $method, $arg_array )
当调用一个未定义的方法是调用此方法
这里的未定义的方法包括没有权限访问的方法;如果方法不存在就去父类中找这个方法,如果父类中也不存在就去调用本类的__call()方法,如果本类中不存在__call()方法就去找父类中的__call()方法。
11、__autoload() 自动加载魔术方法
PHP中如何定义类及其成员属性与操作的更多相关文章
- PHP如何定义类及其成员属性与操作
1.类的定义: 类的关键字定义使用class 1.定义一个空类 Class Person{}; 2.定义一个有成员属性和操作的类 Class Person{ //成员属性 $name = ' ...
- c#利用反射Assembly 对类和成员属性进行操作
protected static void test() { //获取程序集 Assembly assembly = System.Reflection.Assembly.GetExecutingAs ...
- [javaSE] 反射-获取类的成员属性和构造方法
成员属性和构造方法皆为对象,通过Class对象的方法可以得到 package com.tsh.reflect; import java.lang.reflect.Constructor; import ...
- java中遍历实体类,获取属性名和属性值
方式一(实体类): //java中遍历实体类,获取属性名和属性值 public static void testReflect(Object model) throws Exception{ for ...
- 【python】python中的定义类属性和对像属性
python中变量是没有类型的可以绑定任意类型,但是在语法上不能声明变量. 那我们怎麽来声名一个变量呢? f=None 这样我们给着个变量绑定了以各None类型,我们随时可用重新绑定其它类型.这样我们 ...
- C++中如何定义类和对象?
在C++语言中,对象的类型被称为类,类代表了某一批对象的共性和特征. 类是对象的抽象,而对象是类的具体实例.如同C中的结构体一样,我们要先定义一个结构体,再使用结构体去定义一个变量.同一个结构体可以定 ...
- C#学习笔记(八)——定义类的成员
一.成员的定义 1.定义字段 class Myclass { public int MyInt; } 可以使用readonly关键字,表示这个字段只能在执行构造函数的过程中赋值,或者由初始化语句赋值. ...
- 图像处理工具包ImagXpress中如何定义查看器的属性
想要在图像处理控件ImagXpress中查看一个图像,首先需要创建一个查看器,之后你可以按照你自身的需要,来定义查看器的属性. 创建查看器 想要动态的创建一个查看器,需要先定义一个新的mageXVie ...
- C++类继承中,基类/当前对象属性/当前对象的构造顺序
[1]中提到,规范的派生类构造函数三个要点: 首先创建基类对象 应通过成员初始化列表,创建基类对象 应该初始化本派生类新增的成员变量 那在构造派生类实例的过程中,其基类(以及多继承的时候多个基类)/当 ...
随机推荐
- 201521123076 《Java程序设计》第6周学习总结
1.本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖面 ...
- 201521123077 《Java程序设计》第3周学习总结
1. 本周学习总结 2. 书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...
- 201521123065《java程序设计》第13周学习总结
1. 本周学习总结 1.协议是端口之间进行网络通信的一种语言规则语法: 2.套接字Socket用于实现客户端与服务器端的连接,实现网络通信,进行数据交换: 3.LocalHost可以用来获取主机地址: ...
- pyhton之路---面向对象
一.面向过程VS面向对象 面向过程: 优点:极大的降低了写程序的复杂度,只需要顺着执行的步骤,堆叠代码即可. 缺点:一套流水线或者流程就是来解决一个问题,代码就是牵一发而动全身 面 ...
- shell脚本之流程控制
shell脚本之流程控制 shell脚本之流程控制 条件语句 条件判断 循环语句for,while,until for循环 while循环 until循环 循环控制语句continue 循环控制语 ...
- Play使用
play框架 打包命令: play war e:/codes/cn.ngmc.frontend -o f:/backup_ngmc/20160614frontend_001Dev; 即:p ...
- oracle 删除外键约束 禁用约束 启用约束
oracle 删除外键约束 禁用约束 启用约束 执行以下sql生成的语句即可 删除所有外键约束 Sql代码 select 'alter table '||table_name||' drop con ...
- UEditor1.4.3.3整合Spring MVC和七牛
[前言] 项目中涉及将UEditor上传服务器整合进已有的基于Spring MVC的服务中,并且将上传到本地改为上传到七牛,看似简单的一个需求,实际做起来还是遇到了一些困难.在这里分享一下经验-- 七 ...
- [原创]MinHook测试与分析(x64下 E9,EB,CALL指令测试,且逆推测试微软热补丁)
依稀记得第一次接触Hook的概念是在周伟民先生的书中-><<多任务下的数据结构与算法>>,当时觉得Hook很奇妙,有机会要学习到,正好近段日子找来了MiniHook,就一 ...
- 15.linux-LCD层次分析(详解)
如果我们的系统要用GUI(图形界面接口),这时LCD设备驱动程序就应该编写成frambuffer接口,而不是像之前那样只编写操作底层的LCD控制器接口. 什么是frambuffer设备? frambu ...