php成员里面有3种:1、成员属性(类属性),即定义在类中的变量,用于储存类中的数据;2、成员方法,即定义在类中的函数,提供给对象解决事件;3、类常量,是在类中定义的常量,使用const关键字定义。
本教程操作环境:windows7系统、PHP8版、DELL G3电脑
一、概念
类成员指定义在类中的一系列数据,他们是直接依赖于类的一级成员。类成员包括:成员属性、成员方法、类常量。
-
成员属性(类属性):即定义在类中的变量,用于储存类中的数据
-
成员方法:即定义在类中的函数,提供给对象解决事件。
-
类常量:在类中定义的常量,使用const关键字定义。
属性和方法在访问时需要使用访问限定修饰符修饰。
语法:
class 类名{ public $成员属性名[=成员属性值]; //成员属性可以只定义而不赋值,放在之后赋值。 [public] function 成员方法名(){ ... } const 常量名=值; }
类的成员属性可以只定义而不赋值,在之后的逻辑操作中根据情况赋值,但是必须有访问限定修饰符修饰,成员方法的访问限定修饰符可以省略,省略后默认就是public,关于限定修饰符会在后面详解。
二、实现步骤
实现类成员的步骤同样需要进行业务逻辑分析,大致的步骤是:
-
声明类结构
-
分析类是否需要储存数据来确定是否定义成员属性或定义多少成员属性
-
分析类是否要进行某些操作来确定是否要定义成员方法。
-
分析是否需要定义常量
-
对象实例化
-
通过对象调用类成员
例:分析新闻投稿的类的简单示例
实现新闻投稿,首先要声明类结构:
class devote{ }
然后分析是否需要存储数据,很明显,投稿新闻肯定要储存数据,首先要储存新闻标题、新闻内容,然后投稿人的信息,包括昵称,邮箱,手机号等等。
这些数据我们通过成员属性储存:
class devote{ public $nickname="投稿人"; public $title="新闻标题"; public $content="投稿内容"; public $email="邮箱"; public $phone="手机号"; }
然后分析是否需要执行操作,投稿新闻首先要对新闻内容进行过滤,屏蔽不当词语,然后提交到数据库中保存草稿,等待审核。
class devote{ public $nickname="投稿人"; public $content="投稿内容"; public $email="邮箱"; public $phone="手机号"; function clear($content){ //过滤新闻内容 } function input(){ //提交到数据库 } }
需不需要类常量呢?暂且是不需要的,那接下来就是实例化类,然后通过对象调用成员实现功能了。
$devote=new devote(); //实例化对象 $devote->nickname="小杜"; $devote->title="一件大事"; $devote->content="我手机没电了"; $devote->email="2811051813@qq.com"; $devote->phone="就不告诉你"; $devote->clear($devote->content); $devote->input(); //通过调用成员实现业务
关于类成员的调用,我们使用的是->链接,如上面的例子所示,调用类属性的语法是:
$对象->属性名;
请注意:调用属性名不需要加$符,在调用时,他们是一体的。但是在定义属性时,必须有$符表示定义变量。
调用属性会得到当前属性的值,对其赋值就会改变他的值,如上,如果是直接调用title属性,得到的值是“新闻标题”,如果再对其赋值,此时title的值就是一件大事,如果对属性重新赋值了,在接下来使用该属性获得的值都是后面赋值的内容,因为类属性实际上也就是一个变量。
重新赋值等同于:
$devote->title="一件大事"; //等同于: public $title="一件大事";
调用类方法:
$对象->方法名(参数)
调用类常量是静态调用,会在后面详解。
可以通过打印对象来直观的展示上面的内容:
class devote{ public $nickname="投稿人"; public $content="投稿内容"; public $email="邮箱"; public $phone="手机号"; function clear($content){ //过滤新闻内容 } function input(){ //提交到数据库 } } $devote=new devote(); var_dump($devote); //object(devote)#1 (4) { ["nickname"]=> string(9) "投稿人" ["content"]=> string(12) "投稿内容" ["email"]=> string(6) "邮箱" ["phone"]=> string(9) "手机号" }
自己测试一下,可以看到成员属性的值是默认的,如果通过对象给成员属性重新赋值,然后再打印对象:
$devote->nickname="小杜"; $devote->title="一件大事"; $devote->content="我手机没电了"; $devote->email="2811051813@qq.com"; $devote->phone="就不告诉你"; $devote->clear($devote->content); $devote->input(); var_dump($devote);
可以发现类属性的值被改变了。
三、成员操作
上面的例子已经涉及到了成员操作,即访问成员属性和修改成员属性,成元属性基本的操作是增删改查,查和改上面已经演示过,请看增加属性的操作:
增加成员属性直接在对象后调用一个不存在的成员属性并赋值即可:
$devote->id=1; /* 打印结果: object(devote)#1 (6) { ["nickname"]=> string(6) "小杜" ["content"]=> string(18) "我手机没电了" ["email"]=> string(17) "2811051813@qq.com" ["phone"]=> string(15) "就不告诉你" ["title"]=> string(12) "一件大事" ["id"]=> int(1) } */
执行上面的操作后会在类中新增一个属性id,并赋值为1,这个值在之后也可以通过对象直接访问:
echo $devote->id; //输出1
直接调用一个不存在的属性也不会报错,但是他的值是NULL。
var_dump($devote->ids); //NULL
删除类属性使用unset方法:
unset($devote->id); var_dump($devote->id); //NULL
通过对象操作的类属性只在当前对象下生效:
$devote->age=18; $dv=new devote(); var_dump($dv); //object(devote)#2 (4) { ["nickname"]=> string(9) "投稿人" ["content"]=> string(12) "投稿内容" ["email"]=> string(6) "邮箱" ["phone"]=> string(9) "手机号" }
方法操作只有调用一种操作,即只可以通过对象调用类的成员方法:
$devote->input();
注意:类成员在类中可以无限定义,但是类中只能包含类属性、类方法、类常量,其他的语法都不可以写在类中。
class Test{ echo 1234; var_dump("错误"); if($a==1){ echo "True"; } } //syntax error, unexpected 'echo' (T_ECHO), expecting function (T_FUNCTION) or const (T_CONST)
推荐学习:《PHP视频教程》