定界符
定界符的作用就是按照原样,包括换行等特殊字符,存储在其内部的文本;
在定界符中的任何特殊字符都不需要转义,只有变量文本会被其值来替换。
语法格式为:
<<<php
要存放的文本
php;
其中,<<<
为定界符标志,php
类似引号,作为文本的开头和结尾,可自定义,但前后要保持大小写一致。
举几个例子:
$s = <<<php
123,
\n
456
php;
echo $s;
这里输出
123,
456
…,好吧,不是很懂这个定义,似乎该转义的还是会转义,只是看不见的符号会留着。
再来一个:
$x = 123;
$s = <<<php
\$x = $x
php;
echo $s;
这里输出:$x = 123
,
感觉定界符有点像双引号,双引号也可以多行,只是使用双引号时需要加个斜杆转义一下,
而且,定界符是不能用echo
直接打印的,需要先转成变量,所以还是建议使用双引号。
类 / 对象
这里只提一些基本操作(如题)
类的定义
首先,声明一个类要用关键字 class
,然后跟上类名,类名同样由大小写字母、整数和下划线构成,似乎不区分大小写,但使用的时候最好保持大小写一致。
然后加上花括号,一个最简单的类就完成了:
class name {
}
但是调用的话,需要先声明成对象:
$obj = new name;
因为现在这个类里面什么也没有,所以暂时不调用。
一个类应该由属性和方法构成,属性即变量,方法即函数,这些都是在花括号里声明的。
声明类的变量和类外的普通变量有点不一样,也和函数内的变量不一样,
类中变量声明时要在最前面加上var
这个关键词,可以不赋初始值。
访问类的属性和方法时,要在变量后面后面加个->
。
class name {
var $a;
}
$obj = new name;
var_dump($obj->a);
没有赋初始值时,值会是null
。
定义类中的函数与定义普通函数相似,但不能直接访问该类函数,而是要先声明成对象后调用:
class name {
var $var1;
function fun1() {
var_dump($this->var1);
}
}
$obj = new name;
$obj->fun1();
还有一个要注意的地方,在类中函数使用类自身的变量时,需要使用$this->
+变量名,这里的变量名不需要在头部加$
。
构造函数 / 析构函数
类中有两个特殊函数,分别是构造函数(__construct
)和析构函数(__destruct
)。
构造函数是在创建类为对象变量时触发的,这个函数有参数,可以是0个和无限个;
析构函数是在删除变量时触发的,它没有任何参数。
如果没有声明,php将生成无参、无内容的构造和析构函数。
首先来看构造函数, 算了,一起看吧:
class name {
function __construct() {
echo __CLASS__ . '被创建了' . PHP_EOL;
}
function __destruct() {
echo __CLASS__ . '被销毁了' . PHP_EOL;
}
}
$obj = new name;
unset($obj);
__CLASS__
是另一个常量文本,他会被替换成当前所在类的名字。
删除变量可以用unset
完成,也可以等脚本执行结束时自动删除。
这里的输出就是:
name被创建了
name被销毁了
访问控制
类是对象的抽象,对象是类的实例化结果,
如果要用现实中的事物表示对象,那大概就是每一个个体,不管是生物还是物品,
比如说人,一个人,他肯定有他自己想给人知道、不想给人知道,和传承给别人的,
类也是如此,而这就体现在访问控制的三个属性,public
、private
与protected
上。
public
,正如他的英文释义一样,是公开,即外面能直接访问调用的。
而private
,是只有类内部能使用的,protected
是类内部以及继承后的类能使用的,
这两者的区别在于,设定成private
的属性和方法不能被子类继承,只能类自身用。
使用这三个属性也很简单,就只要在变量和函数前面加关键词,麻烦的是每个变量和函数都要加关键词,如果不加关键词,那就会默认当做public
,这点有体现在前面的例子中。
写例子的时候,发现变量的var
和三个权限只能四选一。
还是继续看例子把:
class name {
public $var1;
private $var2;
protected $var3;
public function fun1() {
echo __FUNCTION__ . PHP_EOL;
}
private function fun2() {
echo __FUNCTION__ . PHP_EOL;
}
protected function fun3() {
echo __FUNCTION__ . PHP_EOL;
}
}
$obj = new name;
下图为我用的一个IDE截图,从它的智能语法从也能看出,
只有访问权限设置为public
的变量和函数可以在外部直接调用。
要想在外部访问或操作那些设置为private
和protected
的变量和函数,则需要借助一个public
的函数,在这个函数里再访问那些变量和函数,比如把fun1
改成如下样子:
public function fun1() {
$this->var2 = 2;
$this->var3 = 33;
echo $this->var2 . $this->var3;
}
那么var2
会变成2
,var3
会变成33
,调用fun1
时会输出233
。
继承
有时候,我们想新开个类,对另一个类做扩展,但又不想用他原有的一些东西,那么就要用到提到的protected
这个访问权限。
拿前面写过的name
类开下刀,我们想弄个完全不同的fun1
,还想加个fun4
,并且要调用原来的fun3
,(为啥不调用fun2
呢?因为private
后的函数并不能在继承后的类使用),差点忘了,类名叫name2
:
// 首先,我们需要使用个新关键词`extends`
class name2 extends name {
public function fun1() {
// emm,忘记现在只能用var3了
// 那就魔改下
$this->var1 += 1;
$this->var3 += 9;
// 这个函数没啥用意,只是为了体现出与name中的fun1有所不同
return $this->var1 + $this->var3;
}
public function fun4() {
$this->fun3();
}
}
// 调用的话和普通类没差别
$obj2 = new name2;
echo $obj2->fun1() . PHP_EOL;
echo $obj2->var1 . PHP_EOL;
$obj2->fun4();
然后会发现调用fun1
时不会像name
类里的fun1
输出233
,而是一个数字,
var1
也变成了1
,调用fun4
时会输出fun3
的名字。
目前就暂时写到这里吧,后续文章可能不这么写了,
因为,一个学了还用了几年世界上最好的语言 的PHPer,
从头写一遍算的上一般详细的 教程文章,
还要组织语言,真的太浪费时间,
而且,让我快变成仅仅是为了写博客而学习的,无自身驱动力的学习者。