----------------------------------------------------
PHP 5 数据类型
String(字符串),
Integer(整型), Float(浮点型),
Boolean(布尔型),
Array(数组),
Object(对象),
NULL(空值)
----------------------------------------------------
并置运算符 (.) 用于把两个字符串值连接起来
strlen() 函数返回字符串的长度
strpos() 函数用于在字符串内查找一个字符或一段指定的文本。
如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE
<!--test1.php-->
<!DOCTYPE html>
<html>
<body>
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
echo "\n"; // echo "\n"; 换行
echo "length:" . strlen("Hello world!"); // strlen() 函数返回字符串的长度 一个中文占 3 个字符数
echo "\n";
echo "findIndex(world) " . strpos("Hello world!","world"); // 返回搜到的索引的位置
echo "\n";
echo "findIndex(zuk) " . strpos("Hello world!","zuk"); // 返回False
?>
</body>
</html>
<!--
Hello world! What a nice day!
length:12
findIndex(world) 6
findIndex(zuk)
-->
----------------------------------------------------
PHP EOF(heredoc)是一种在命令行shell和程序语言里定义一个【多行字串】的方法
能在字串中 拼接字符串
<!--test2.php-->
<!DOCTYPE html>
<html>
<body>
<?php
$name="runoob";
$a= <<<EOF
"abc"$name
"123"
EOF;
// 结束需要独立一行且前后不能空格
echo $a;
?>
</body>
</html>
<!--
输出结果:
"abc"runoob
"123"
-->
----------------------------------------------------
PHP var_dump() 函数返回变量的数据类型和值:int(5985)
<!--test3.php-->
<!DOCTYPE html>
<html>
<body>
<?php
$x = 5985;
var_dump($x);
echo "<br>";
$x = -345; // 负数
var_dump($x);
echo "<br>";
$x = 0x8C; // 十六进制数
var_dump($x);
echo "<br>";
$x = 047; // 八进制数
var_dump($x);
$x = 10.365; //浮点数
var_dump($x);
echo "<br>";
$x = 2.4e3; // 浮点数指数形式 2.4 * 10(3) 2.4乘10的三次方 2400
var_dump($x);
echo "<br>";
$x = 8E-5; //浮点数指数形式 8 * 10(-5)
var_dump($x);
$x=true;
var_dump($x); //布尔值形式
$y=false;
var_dump($y);
$cars=array("Volvo","BMW","Toyota");
var_dump($cars); // 数组类型
class Car
{
var $color;
function Car($color="green") {
$this->color = $color;
}
function what_color() {
return $this->color;
}
}
$mCar=new Car("red");
var_dump($mCar); // Object(对象)类型
$x=null;
var_dump($x); // 空类型
?>
</body>
</html>
<!--
输出结果:
nt(5985)
int(-345)
int(140)
int(39)
float(10.365)
float(2400)
float(8.0E-5)
bool(true)
bool(false)
array(3) {
[0]=>
string(5) "Volvo"
[1]=>
string(3) "BMW"
[2]=>
string(6) "Toyota"
}
object(Car)#1 (1) {
["color"]=>
string(3) "red"
}
NULL
-->
----------------------------------------------------
设置常量,使用 define() 函数,函数语法如下
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
name:必选参数,常量名称,即标志符。
value:必选参数,常量的值。
case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的
<!--test4.php-->
<!DOCTYPE html>
<html>
<body>
<?php
// 区分大小写的常量名 第三个参数 Boolean 用于区分变量大小写不敏感
define("GREETING", "欢迎世界",true);
echo GREETING; // 输出 "欢迎世界"
echo '<br>';
echo greeting; // 输出 欢迎世界
?>
</body>
</html>
<!--
输出结果:
欢迎世界
欢迎世界
-->
----------------------------------------------------
PHP if语句 switch语句
while - 只要指定的条件成立,则循环执行代码块
do...while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环
<!--test5.php-->
<!DOCTYPE html>
<html>
<body>
<?php
$t=date("H");
if ($t<"10")
{
echo "Have a good morning!";
}
elseif ($t<"20")
{
echo "Have a good day!";
}
else
{
echo "Have a good night!";
}
echo "\n";
$favcolor="red";
switch ($favcolor)
{
case "red":
echo "你喜欢的颜色是红色!";
break;
case "blue":
echo "你喜欢的颜色是蓝色!";
break;
case "green":
echo "你喜欢的颜色是绿色!";
break;
default:
echo "你喜欢的颜色不是 红, 蓝, 或绿色!";
}
$i=1;
while($i<=5)
{
echo "The number is " . $i . "<br>";
$i++;
}
$i=5;
do
{
$i++;
echo "The number is " . $i . "<br>";
}
while ($i<=10);
?>
</body>
</html>
<!--
输出结果:
Have a good day!
你喜欢的颜色是红色!The number is 1
The number is 2
The number is 3
The number is 4
The number is 5
The number is 7
The number is 8
The number is 9
The number is 10
The number is 11
-->
----------------------------------------------------
array() 函数用于创建数组:
数值数组 - 带有数字 ID 键的数组
关联数组 - 带有指定的键的数组,每个键关联一个值
多维数组 - 包含一个或多个数组的数组
获取数组的长度 - count() 函数
遍历并打印数值数组中的所有值,您可以使用 for 循环
array("Peter"=>"35","Ben"=>"37","Joe"=>"43"); 实现Map类似的数组
历并打印关联数组中的所有值,您可以使用 foreach 循环
<!--test6.php-->
<!DOCTYPE html>
<html>
<body>
<?php
$cars=array("Volvo","BMW","Toyota");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
echo "\n";
$cars[0]="benz";
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
echo "\n";
echo "array.length: " . count($cars);
$arrlength=count($cars);
for($x=0;$x<$arrlength;$x++) // for循环语句 遍历值数组
{
echo $cars[$x];
echo "<br>";
}
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43"); // map类似的数组
$age['Peter']="100"; // 访问数组索引使用key
foreach($age as $x=>$x_value) // 遍历Map形式的数组
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
echo "<br>";
var_dump($age);
?>
</body>
</html>
<!--
输出结果:
I like Volvo, BMW and Toyota.
I like benz, BMW and Toyota.
array.length: 3benz
BMW
Toyota
Key=Peter, Value=100
Key=Ben, Value=37
Key=Joe, Value=43
array(3) {
["Peter"]=>
string(3) "100"
["Ben"]=>
string(2) "37"
["Joe"]=>
string(2) "43"
}
-->
----------------------------------------------------
sort() - 对数组进行升序排列
rsort() - 对数组进行降序排列
asort() - 根据关联数组的值,对数组进行升序排列
ksort() - 根据关联数组的键,对数组进行升序排列
arsort() - 根据关联数组的值,对数组进行降序排列
krsort() - 根据关联数组的键,对数组进行降序排列
<!--test7.php-->
<!DOCTYPE html>
<html>
<body>
<?php
$numbers=array(4,6,2,22,11);
echo "原始排序:";
var_dump($numbers);
echo "<br>";
echo "正向排序:";
sort($numbers);
var_dump($numbers);
echo "<br>";
echo "逆向排序:";
rsort($numbers);
var_dump($numbers);
echo "<br>";
$age=array("Ceter"=>"100","Ben"=>"10","Aoe"=>"43");
echo "原始Map序列:";
echo "<br>";
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
echo "<br>";
asort($age);
echo "依据Map的Value进行正序排序:";
echo "<br>";
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
echo "<br>";
ksort($age);
echo "依据Map的Key进行正序排序:";
echo "<br>";
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
echo "<br>";
arsort($age);
echo "依据Map的Value进行逆序排序:";
echo "<br>";
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
echo "<br>";
krsort($age);
echo "依据Map的Key进行逆序排序:";
echo "<br>";
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
echo "<br>";
var_dump($age);
?>
</body>
</html>
<!--
原始排序:array(5) {
[0]=>
int(4)
[1]=>
int(6)
[2]=>
int(2)
[3]=>
int(22)
[4]=>
int(11)
}
正向排序:array(5) {
[0]=>
int(2)
[1]=>
int(4)
[2]=>
int(6)
[3]=>
int(11)
[4]=>
int(22)
}
逆向排序:array(5) {
[0]=>
int(22)
[1]=>
int(11)
[2]=>
int(6)
[3]=>
int(4)
[4]=>
int(2)
}
原始Map序列:
Key=Ceter, Value=100
Key=Ben, Value=10
Key=Aoe, Value=43
依据Map的Value进行正序排序:
Key=Ben, Value=10
Key=Aoe, Value=43
Key=Ceter, Value=100
依据Map的Key进行正序排序:
Key=Aoe, Value=43
Key=Ben, Value=10
Key=Ceter, Value=100
依据Map的Value进行逆序排序:
Key=Ceter, Value=100
Key=Aoe, Value=43
Key=Ben, Value=10
依据Map的Key进行逆序排序:
Key=Ceter, Value=100
Key=Ben, Value=10
Key=Aoe, Value=43
array(3) {
["Ceter"]=>
string(3) "100"
["Ben"]=>
string(2) "10"
["Aoe"]=>
string(2) "43"
}
-->
----------------------------------------------------
超级全局变量在PHP 4.1.0之后被启用, 是PHP系统中自带的变量,在一个脚本的全部作用域中都可用。
PHP中预定义了几个超级全局变量(superglobals)
这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。
http://www.runoob.com/php/php-superglobals.html
$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
$GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问
是一个包含了全部变量的全局组合数组。变量的名字就是数组的键
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。
这个数组中的项目由 Web 服务器创建
$_REQUEST 用于收集HTML表单提交的数据。
以下实例显示了一个输入字段(input)及提交按钮(submit)的表单(form)。
当用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文件
$_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。
以下实例显示了一个输入字段(input)及提交按钮(submit)的表单(form)。
当用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文件。
$_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"。
$_GET 也可以收集URL中发送的数据。
<!--test7.php-->
<!DOCTYPE html>
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname2">
<input type="submit">
</form>
<a href="test_get.php?subject=PHP&web=www.baidu.com">Test $GET</a>
<?php
$name = $_REQUEST['fname'];
echo $name;
$name2 = $_REQUEST['fname2'];
echo $name2;
echo "Study " . $_GET['subject'] . " at " . $_GET['web'];
$x = 75;
$y = 25;
function addition()
{
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition();
echo $z; //z 是一个$GLOBALS数组中的超级全局变量,该变量同样可以在函数外访问
echo "<br>";
echo "------------------------";
echo "<br>";
var_dump($GLOBALS);
?>
</body>
</html>
<!--
输出结果:
Study at 100
------------------------
array(14) {
["_GET"]=>
array(0) {
}
["_POST"]=>
array(0) {
}
["_COOKIE"]=>
array(0) {
}
["_FILES"]=>
array(0) {
}
["argv"]=>
array(2) {
[0]=>
string(18) "/usercode/file.php"
[1]=>
string(1) "-"
}
["argc"]=>
int(2)
["_SERVER"]=>
array(17) {
["HOSTNAME"]=>
string(12) "2753e92c701c"
["TERM"]=>
string(5) "xterm"
["PATH"]=>
string(60) "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
["PWD"]=>
string(1) "/"
["NODE_PATH"]=>
string(27) "/usr/local/lib/node_modules"
["SHLVL"]=>
string(1) "1"
["HOME"]=>
string(5) "/root"
["_"]=>
string(12) "/usr/bin/php"
["PHP_SELF"]=>
string(18) "/usercode/file.php"
["SCRIPT_NAME"]=>
string(18) "/usercode/file.php"
["SCRIPT_FILENAME"]=>
string(18) "/usercode/file.php"
["PATH_TRANSLATED"]=>
string(18) "/usercode/file.php"
["DOCUMENT_ROOT"]=>
string(0) ""
["REQUEST_TIME_FLOAT"]=>
float(1518580241.454)
["REQUEST_TIME"]=>
int(1518580241)
["argv"]=>
array(2) {
[0]=>
string(18) "/usercode/file.php"
[1]=>
string(1) "-"
}
["argc"]=>
int(2)
}
["_REQUEST"]=>
array(0) {
}
["GLOBALS"]=>
*RECURSION*
["name"]=>
NULL
["name2"]=>
NULL
["x"]=>
int(75)
["y"]=>
int(25)
["z"]=>
int(100)
}
-->
----------------------------------------------------
在 PHP 中,提供了超过 1000 个内建的函数。
http://www.runoob.com/php/php-functions.html
PHP 函数准则:
函数的名称应该提示出它的功能
函数名称以字母或下划线开头(不能以数字开头)
<!--test8.php-->
<!DOCTYPE html>
<html>
<body>
<?php
function writeName() // 不带参数
{
echo "Zukgit";
}
echo "My name is ";
writeName();
echo '<br>';
function writeName1($fname) // 带参数
{
echo $fname . " Happy new Year.<br>";
}
echo "My name is ";
writeName1("Zukgit");
function add($x,$y)
{
$total=$x+$y;
return $total; // 带返回值的参数
}
echo "1 + 16 = " . add(1,16);
?>
</body>
</html>
<!--
输出结果:
My name is Zukgit
My name is Zukgit Happy new Year.
1 + 16 = 17
-->
----------------------------------------------------
PHP 向它运行的任何脚本提供了大量的预定义常量。
有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
__LINE__ 文件中的当前行号
__FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
__DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
__FUNCTION__ 函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写
_CLASS__ 类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
__TRAIT__ Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
__METHOD__ 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
__NAMESPACE__ 当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)
<!--test9.php-->
<!DOCTYPE html>
<html>
<body>
<?php
echo '这是第 " ' . __LINE__ . ' " 行';
echo '<br>';
echo '这是第 " ' . __LINE__ . ' " 行';
echo '<br>';
echo '这是第 " ' . __LINE__ . ' " 行';
echo '该文件位于 " ' . __FILE__ . ' " ';
echo '<br>';
echo '该文件目录位于 " ' . __DIR__ . ' " ';
echo '<br>';
function test() {
echo '被调用函数名为:' . __FUNCTION__ ;
}
test();
echo '<br>';
class obj1 {
function _print() {
echo '类名为:' . __CLASS__ . "<br>";
echo '函数名为:' . __FUNCTION__ ;
}
}
$mObject= new obj1();
$mObject->_print();
echo '命名空间为:"', __NAMESPACE__, '"';
?>
</body>
</html>
<!--
输出结果:
这是第 " 8 " 行
这是第 " 10 " 行
这是第 " 12 " 行该文件位于 " /usercode/file.php "
该文件目录位于 " /usercode "
被调用函数名为:test
类名为:obj1
函数名为:_print命名空间为:""
-->
----------------------------------------------------
在PHP中,别名是通过操作符 use 来实现的. 下面是一个使用所有可能的三种导入方式的例子:
1、使用use操作符导入/使用别名
namespace foo;
use My\Full\Classname as Another;
// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;
// 导入一个全局类
use \ArrayObject;
$obj = new namespace\Another; // 实例化 foo\Another 对象
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
2、 一行中包含多个use语句
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
3、导入和动态名称
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // 实例化一个 My\Full\Classname 对象
$a = 'Another';
$obj = new $a; // 实际化一个 Another 对象
4、导入和完全限定名称
use My\Full\Classname as Another, My\Full\NSname;
----------------------------------------------------
面向对象内容
http://www.runoob.com/php/php-oop.html
类 − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
对象 − 是类的实例。
成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。
成员函数 − 定义在类的内部,可用于访问对象的数据。
继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。
子类 − 一个类继承其他类称为子类,也可称为派生类。
多态 − 多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
PHP 构造函数
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,
总与new运算符一起使用在创建对象的语句中。
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}
PHP 析构函数
function __destruct() {
print "销毁 " . $this->name . "\n";
}
PHP 继承
class Child_Site extends Site {
}
访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
public(公有):公有的类成员可以在任何地方被访问。
protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
private(私有):私有的类成员则只能被其定义所在的类访问。
<!--test11.html>
<html>
<body>
<?php
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public<br>';
protected $protected = 'Protected<br>';
private $private = 'Private<br>';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
#echo $obj->protected; // 这行会产生一个致命错误
#echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 可以对 public 和 protected 进行重定义,但 private 而不能
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // 这行能被正常执行
echo $obj2->private; // 未定义 private
#echo $obj2->protected; // 这行会产生一个致命错误
$obj2->printHello(); // 输出 Public、Protected2 和 Undefined
?>
</body>
</html>
<!--
输出结果:
Public
Public
Protected
Private
Public
Public
Protected2
-->
接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。
<!--test12.php-->
<!DOCTYPE html>
<html>
<body>
<?php
// 声明一个'iTemplate'接口
interface iTemplate
{
public function setVariable($name, $var);
public function getInfo();
}
// 实现接口
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getInfo()
{
foreach($this->vars as $name => $value) {
echo '{' . $name . '}' . "value :" . $value;
echo '<br>';
}
}
}
$mInterface = new Template();
$mInterface->setVariable("A","1");
$mInterface->setVariable("B","2");
$mInterface->getInfo();
?>
</body>
</html>
<!--
输出结果:
{A}value :1
{B}value :2
-->
----------------------------------------------------
抽象类
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
定义为抽象的类不能被实例化。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;
另外,这些方法的访问控制必须和父类中一样(或者更为宽松)
<!--test13.php-->
<!DOCTYPE html>
<html>
<body>
<?php
abstract class AbstractClass
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . PHP_EOL;
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') . PHP_EOL;
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') . PHP_EOL;
?>
</body>
</html>
<!--
输出结果:
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
-->
----------------------------------------------------
Static 关键字
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
<!--test14.php-->
<!DOCTYPE html>
<html>
<body>
<?php
class Foo {
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
print Foo::$my_static . PHP_EOL;
$foo = new Foo();
print $foo->staticValue() . PHP_EOL;
?>
</body>
</html>
<!--
输出结果:
foo
foo
-->
----------------------------------------------------
PHP 不会在子类的构造方法中自动的调用父类的构造方法。
要执行父类的构造方法,需要在子类的构造方法中调用
parent::__construct() 。
<!--test15.php-->
<!DOCTYPE html>
<html>
<body>
<?php
class BaseClass {
function __construct() {
print "BaseClass 类中构造方法" . PHP_EOL;
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct(); // 子类构造方法不能自动调用父类的构造方法
print "SubClass 类中构造方法" . PHP_EOL;
}
}
class OtherSubClass extends BaseClass {
// 继承 BaseClass 的构造方法
}
// 调用 BaseClass 构造方法
$obj = new BaseClass();
// 调用 BaseClass、SubClass 构造方法
$obj = new SubClass();
// 调用 BaseClass 构造方法
$obj = new OtherSubClass();
?>
</body>
</html>
<!--
输出结果:
BaseClass 类中构造方法
BaseClass 类中构造方法
SubClass 类中构造方法
BaseClass 类中构造方法
-->
PHP基础
最新推荐文章于 2024-03-21 11:02:56 发布