- 介绍
- 本地环境安装
- 安装 WNMP 环境
- 代码编辑器选择
- 语法
- 变量与常量
- 常见输出函数
- 数据类型之四种标量类型
- 数据类型之三种复合类型
- 数据类型之两种特殊类型
- Operators:运算符
- 流程控制:条件判断语句
- 流程控制:循环语句
- 流程控制:中止语句
- 函数
- 类和对象:基本概念
- 类和对象:类结构
- 类和对象:面向对象
- 类和对象:三种特殊类
- 类和对象
- 类和对象:Trait
- 类和对象:魔术方法
- 命名空间
- 【实战】PHP表单
-
String
- addcslashes()
- addslashes()
- bin2hex()
- chop()
- chr()
- chunk_split()
- convert_cyr_string()
- convert_uudecode()
- convert_uuencode()
- count_chars()
- crc32()
- crypt()
- echo
- explode()
- fprintf()
- get_html_translation_table()
- hebrev()
- hebrevc()
- hex2bin()
- htmlentities()
- htmlspecialchars()
- htmlspecialchars_decode()
- html_entity_decode()
- implode()
- join()
- lcfirst()
- levenshtein()
- localeconv()
- ltrim()
- md5()
- md5_file()
- metaphone()
- money_format()
- nl2br()
- nl_langinfo()
- number_format()
- ord()
- parse_str()
- printf
- quoted_printable_decode()
- quoted_printable_encode()
- quotemeta()
- rtrim()
- setlocale()
- sha1()
- sha1_file()
- similar_text()
- soundex()
- sprintf()
- sscanf()
- strcasecmp()
- strchr()
- strcmp()
- strcoll()
- strcspn()
- stripcslashes()
- stripos()
- stripslashes()
- strip_tags()
- stristr()
- strlen()
- strnatcasecmp()
- strnatcmp()
- strncasecmp()
- strncmp()
- strpbrk()
- strpos()
- strrchr()
- strrev()
- strripos()
- strrpos()
- strspn()
- strstr()
- strtok()
- strtolower()
- strtoupper()
- strtr()
- str_getcsv()
- str_ireplace()
- str_pad()
- str_repeat()
- str_replace()
- str_rot13()
- str_shuffle()
- str_split()
- str_word_count()
- substr()
- substr_compare()
- substr_count()
- substr_replace()
- trim()
- ucfirst()
- ucwords()
- vfprintf()
- vprintf()
- vsprintf()
- wordwrap()
-
Array
- array()
- array_change_key_case()
- array_chunk()
- array_column()
- array_combine()
- array_count_values()
- array_diff()
- array_diff_assoc()
- array_diff_key()
- array_diff_uassoc()
- array_diff_ukey()
- array_fill()
- array_fill_keys()
- array_filter()
- array_flip()
- array_intersect()
- array_intersect_assoc()
- array_intersect_key()
- array_intersect_uassoc()
- array_intersect_ukey()
- array_keys()
- array_key_exists()
- array_key_first()
- array_key_last()
- array_map()
- array_merge()
- array_merge_recursive()
- array_multisort()
- array_pad()
- array_pop()
- array_product()
- array_push()
- array_rand()
- array_reduce()
- array_replace()
- array_replace_recursive()
- array_reverse()
- array_search()
- array_shift()
- array_slice()
- array_splice()
- array_sum()
- array_udiff()
- array_udiff_assoc()
- array_udiff_uassoc()
- array_uintersect()
- array_uintersect_assoc()
- array_uintersect_uassoc()
- array_unique()
- array_unshift()
- array_values()
- array_walk()
- array_walk_recursive()
- arsort()
- asort()
- compact()
- count()
- current()
- each()
- end()
- extract()
- in_array()
- key()
- key_exists()
- krsort()
- ksort()
- list()
- natcasesort()
- natsort()
- next()
- pos()
- prev()
- range()
- reset()
- rsort()
- shuffle()
- sizeof()
- sort()
- uasort()
- uksort()
- usort()
-
File
- basename()
- chgrp()
- chmod()
- chown()
- clearstatcache()
- copy()
- dirname()
- diskfreespace()
- disk_free_space()
- disk_total_space()
- fclose()
- feof()
- fflush()
- fgetc()
- fgetcsv()
- fgets()
- fgetss()
- file()
- fileatime()
- filectime()
- filegroup()
- fileinode()
- filemtime()
- fileowner()
- fileperms()
- filesize()
- filetype()
- file_exists()
- file_get_contents()
- file_put_contents()
- flock()
- fnmatch()
- fopen()
- fpassthru()
- fputcsv()
- fputs()
- fread()
- fscanf()
- fseek()
- fstat()
- ftell()
- ftruncate()
- fwrite()
- glob()
- is_dir()
- is_executable()
- is_file()
- is_link()
- is_readable()
- is_uploaded_file()
- is_writable()
- is_writeable()
- lchgrp()
- lchown()
- link()
- linkinfo()
- lstat()
- mkdir()
- move_uploaded_file()
- parse_ini_file()
- parse_ini_string()
- pathinfo()
- pclose()
- popen()
- readfile()
- readlink()
- realpath()
- realpath_cache_get()
- realpath_cache_size()
- rename()
- rewind()
- rmdir()
- set_file_buffer()
- stat()
- symlink()
- tempnam()
- tmpfile()
- touch()
- umask()
- unlink()
-
Datetime
- checkdate()
- date()
- date_add()
- date_create()
- date_create_from_format()
- date_date_set()
- date_default_timezone_get()
- date_default_timezone_set()
- date_diff()
- date_format()
- date_get_last_errors()
- date_interval_create_from_date
- date_interval_format()
- date_isodate_set()
- date_modify()
- date_offset_get()
- date_parse()
- date_parse_from_format()
- date_sub()
- date_sunrise()
- date_sunset()
- date_sun_info()
- date_timestamp_get()
- date_timestamp_set()
- date_timezone_get()
- date_timezone_set()
- date_time_set()
- getdate()
- gettimeofday()
- gmdate()
- gmmktime()
- gmstrftime()
- idate()
- localtime()
- microtime()
- mktime()
- strftime()
- strptime()
- strtotime()
- time()
- timezone_abbreviations_list()
- timezone_identifiers_list()
- timezone_location_get()
- timezone_name_from_abbr()
- timezone_name_get()
- timezone_offset_get()
- timezone_open()
- timezone_transitions_get()
- timezone_version_get()
-
Filter
-
HTTP
-
cURL
- curl_close()
- curl_copy_handle()
- curl_errno()
- curl_error()
- curl_escape()
- curl_exec()
- curl_file_create()
- curl_getinfo()
- curl_init()
- curl_multi_add_handle()
- curl_multi_close()
- curl_multi_errno()
- curl_multi_exec()
- curl_multi_getcontent()
- curl_multi_info_read()
- curl_multi_init()
- curl_multi_remove_handle()
- curl_multi_select()
- curl_multi_setopt()
- curl_multi_strerror()
- curl_pause()
- curl_reset()
- curl_setopt()
- curl_setopt_array()
- curl_share_close()
- curl_share_errno()
- curl_share_init()
- curl_share_setopt()
- curl_share_strerror()
- curl_strerror()
- curl_unescape()
- curl_version()
-
PDO
-
PDOStatement
类和对象:三种特殊类
上一节我们学习了面向对象的基本概念,了解了面向对象的三个特性:
- 继承
- 子类可继承父类的所有可访问方法及属性,并且子类可自我扩展(拥有自己的属性和方法)
- 封装
- 利用访问控制(
public
、protected
、private
)进行数据细节的隐藏
- 利用访问控制(
- 多态
- 通过实现接口,相同方法在不同对象上具有不同的结果
复习完毕,这一节我们将学习三种特殊的类。
在 PHP 的类中,有三种类比较特别,它们分别是:抽象类、final 类和匿名类。
抽象类
抽象类不能被实例化,因为抽象类并不完整。抽象类只规定这个类“是什么”,部分或全部操作的实现延迟到子类中,故而无法被实例化。
抽象类使用关键字abstract
进行声明,语法如下:
abstract class AbstractClass
{
// 类定义
}
抽象类中可能包含抽象方法,不能被实例化,其余与普通类一致。
抽象方法
抽象方法也不提供具体的实现。
含有抽象方法的类必须被定义为抽象类(抽象方法本就不完整),而抽象类不一定要包含抽象方法。如下代码:
<?php
// 抽象类
abstract class AbstractClass
{
public $prop = '没有抽象属性的概念';
public $str = '只有抽象类和抽象方法';
// 抽象类和抽象方法使用关键字 abstract 声明
// 并且抽象方法没有具体实现,故而只需声明方法,而没有实现代码块(花括号)
abstract public function abstractFunc();
public function notAbstractFunc()
{
echo '抽象类也可以包含非抽象方法',"\n";
}
}
// 测试:
$abst = new AbstractClass();
var_dump($abst);// Fatal error: Uncaught Error: Cannot instantiate abstract class
class NotAbstract
{
public $prop = '尝试声明一个含有抽象方法但没有使用关键字abstract声明的类';
abstract public function abstractFunc();
}
// 测试:
$abst = new NotAbstract();
var_dump($abst);// Fatal error: Class NotAbstract contains 1 abstract method and must therefore be declared abstract or implement the remaining methods
继承一个抽象类时,子类必须实现父类中的所有抽象方法,否则子类也必须被定义为抽象类(因为该类中还存在未被实现的抽象方法)。
final类
final
类表明该类不允许被继承,使用关键字final
声明,语法如下:
final class FinalClass
{
// 类定义
}
继承一个final
类将会造成错误:
<?php
// final 类
final class Subclass {}
class Ordinary extends Subclass {}
// 测试:
$ordinary = new Ordinary();
var_dump($ordinary);// Fatal error: Class Ordinary may not inherit from final class (Subclass)
同时,final
关键字也可以定义方法。
final 方法
final
方法表示该方法不能被子类覆盖(不能在子类重写该方法),示例如下:
class Base
{
final public function finalFunc()
{
echo '我是一个无法被子类重写的顽固派',"\n";
}
}
class Subclass extends Base
{
public function finalFunc()
{
echo '我试图重写父类的final方法',"\n";
}
}
$sub = new Subclass();
$sub->finalFunc();// Fatal error: Cannot override final method Base::finalFunc()
final
关键字声明的类或方法通常用于不希望有任何改变的情况,就像它的名字,“最终的”,最终方案是不希望再修改的。
匿名类
最后一个特殊类是匿名类。它可以创建一次性的简单对象。语法:
new class {
// 类定义
}
请看下面示例:
<?php
// 匿名类
function anonymous1()
{
return new class {};// 返回一个空的匿名类
}
function anonymous2()
{
return new class {
public $prop = '匿名类的一个public属性';
private $_prop = '匿名类的一个private属性';
};
}
$anon1 = anonymous1();
var_dump($anon1);
/* 输出:
object(class@anonymous)#1 (0) {
}
*/
$anon2 = anonymous2();
var_dump($anon2);
/* 输出:
object(class@anonymous)#2 (2) {
["prop"]=>
string(30) "匿名类的一个public属性"
["_prop":"class@anonymous":private]=>
string(31) "匿名类的一个private属性"
}
*/
匿名类可以继承其他类、实现接口以及使用 Trait。但如果匿名类嵌套在普通类中,在匿名类中如果要访问这个普通类的受保护的(protected
)或者私有(private
)属性,则必须将该属性传入匿名函数的构造函数,否则无法访问。下方的示例代码构造了一个简单的消息传递类,当一条消息发出时,匿名函数处理这条消息。
<?php
class Chat
{
public $name;
private $msg;
public function __construct($name, $msg)
{
$this->name = $name;
$this->msg = $msg;
}
// 处理发来的消息:阅读,并提示“已阅”
public function read()
{
return new class($this->name, $this->msg) extends Chat {
// 外部类的私有属性必须使用构造函数传递后才能使用
public function __construct($name, $msg)
{
$this->name = $name;
$this->msg = $msg;
}
public function prompt()
{
echo $this->name, '发来消息:',$this->msg, PHP_EOL;
}
};
}
}
// 测试:
$user = new Chat('小明', '你好');
$user->read()->prompt();// 输出:小明发来消息:你好
上方示例代码中,类Chat
的公开属性$name
在匿名函数中也传递给了其构造函数,这是因为如果不传递,该匿名类继承Chat
类,$name
的值将被初始化为NULL
。
匿名函数适合这种仅用一次的类定义。类似的还有日志打印等等。
本节中我们讲解了 PHP 中类与对象的三种特殊类:抽象类、final 类和匿名类,分别阐述了它们的特点与使用场景,应该根据其特点选择使用合适的类。
下一节我们进入接口的学习!