本章主要介绍 PHP 的函数与对象的一些应用:
<?php
// PHP 函数与对象
print("test"); // 或 print "test";
echo(abs(5-8)); // 或 echo abs(5-8);
// 输出 test3
echo "<br>";
echo strrev(" .dlrow olleH"); // 将字符串次序颠倒
echo str_repeat("Hip ",2); // 重复字符串
echo strtoupper("hooray! "); // 将字符串转为大写
echo strtolower("HoOrAy! "); // 将字符串转为小写
echo ucfirst("hoOrAy!"); // 只将第一个字符大写
// 输出 Hello world. Hip Hip HOORAY! hooray! HoOrAy!
echo "<br>";
// 整理姓名
function fix_name1($n1, $n2, $n3)
{
$n1 = ucfirst(strtolower($n1));
$n2 = ucfirst(strtolower($n2));
$n3 = ucfirst(strtolower($n3));
return array($n1, $n2, $n3); // 以数组的形式返回
}
print_r(fix_name1("WILLIAM", "henry", "gatES")); // 输出 Array ( [0] => William [1] => Henry [2] => Gates )
echo "<br>";
$a1 = "WILLIAM";
$a2 = "henry";
$a3 = "gatES";
function fix_name2() // PHP 不允许重名
{
global $a1, $a2, $a3; // 不加这句会报变量未定义的错误
$a1 = ucfirst(strtolower($a1));
$a2 = ucfirst(strtolower($a2));
$a3 = ucfirst(strtolower($a3));
}
fix_name2();
echo $a1." ".$a2." ".$a3; // 输出 William Henry Gates
echo "<br>";
// global $str = "abc"; 错误:全局变量声明的时候不能初始化
$came_from = htmlentities($_SERVER['SERVER_NAME']); // htmlentities 函数会将所有字符转化为 HTML 实体,如:< 被转化为 <
$came_from .= htmlentities($_SERVER['PHP_SELF']);
echo $came_from; // 输出 www.bxg.com/练习.php
// 如果使用include,则include包含的文件中如果继续调用include,会报错。
// include, include_once 只会试图导入被请求的文件,即便文件没有找到也会继续执行。
// 不使用 require 和 不使用 include 的道理是一样的。
// 所以应该使用 require_once 导入文件。
echo "<br>";
var_dump(function_exists("fix_name2")); // 检查函数是否存在,包括自定义的函数。函数存在,输出 bool(true)
var_dump(function_exists("fix_name3")); // 函数不存在,输出 bool(false)
echo phpversion(); // 检测代码运行版本。输出 7.1.1
echo "<br>";
define("CONSTVAR1", 123); // 定义常量,区分大小写,常量要用""引起来
echo CONSTVAR1; // 访问常量不需要$,输出 123
define("CONSTVAR2", 456, true); // 定义常量,不区分大小写,常量要用""引起来
echo constVar2; // 输出 456
const CONSTVAR3 = 789; // 定义常量,区分大小写,常量不需要用""引起来
echo CONSTVAR3; // 输出 789
echo "<br>";
// 对象克隆
class User {
public $name, $password; // 变量必须要有关键字(public(或var), protected, private)声明,即单独写 $password是错误的; public 后面不加 :
// public $time = time(); 类中给变量赋初值时应该是常量,不能是函数或者表达式计算的结果 (注意, 赋值 2*7 可以,代表常量 14,但是赋值 $var * 7 就不可以了,即使 $var = 2)
function __construct($param1, $param2) { // 构造函数, 也可以使用类名 (User) 本身
$this -> name = $param1; // 不能使用 $name -> param1,必须要使用 $this
$this -> password = $param2;
}
function __destruct() { // 构造函数
// 再此添加析构函数的语句
}
function get_password() { // 用户自定义的函数不能以 __ 开头; 函数不用显式地用关键字声明,默认为 public
return $this -> password; // 访问属性或方法时,属性和函数的前面不加 $
// 不能使用 return $password
}
function test() { // 如果防止子类方法覆盖父类方法,应该在function前面使用final关键字
echo "I'm your father.";
}
}
/*
$obj1 = new User; // 构造函数没有参数的时候,或者使用 $obj1 = new User();
$obj1 -> name = "Ma"; // 访问属性或方法时,属性和函数的前面不加 $
$obj2 = $obj1; // 这样做会使 $obj1 和 $obj2 指向同一个对象
$obj2 -> name = "Hao";
echo $obj1->name . " " . $obj2->name; // 输出 Hao Hao
echo "<br>";
$obj1 -> name = "Ma";
$obj2 = clone $obj1; // 使用 clone 操作符 可以创建一个新实例,同时将 obj1 的值赋给 obj2
$obj2 -> name = "Hao";
echo $obj1->name . " " . $obj2->name; // 输出 Ma Hao
echo "<br>";
*/
$obj3 = new User("Bing", 123); // 带参数的构造函数
$obj3 -> age = 12 + 13; // 可以在初次使用该属性的同时定义, 此时类中相当于有 $age = 25; 而且,这个变量可以被赋值为 常量、变量或表达式、函数等; 默认为 public
print_r($obj3); // 输出 User Object ( [name] => Bing [password] => 123 [age] => 25 )
echo $obj3 -> get_password(); // 输出 123
echo "<br>";
// 声明常量
class Translate {
const ENGLIST = 2; // 定义常量的另外一种方法,一旦定义了一个常量,就不能改变它的值
var $name = "Ma"; // 跟 public 一样,老版本兼容,但不提倡
static $password = 2*4; // 静态属性, 只能赋常量值,不能将函数、表达式赋给 $password
static function lookup() { // 在类中定义的静态方法,需要用 类名本身来引用,而不是对象
echo self::ENGLIST; // 使用 self 关键字和 :: 操作符能够直接引用常量,区分大小写
// $this -> name = "hhh"; 静态方法不能访问任何对象属性或方法
echo self::$password; // 使用 self 关键字和 :: 操作符能够直接引用静态属性
}
}
Translate:: lookup(); // 用类名引用静态函数,以便不用实例化就可以访问; 使用 :: 而不是 -> ; 输出28
echo "<br>";
// 继承
class Subscriber extends User {
public $phone, $email;
function __construct($param) {
parent::__construct($this->name, $this->password); // 注意!首先调用父类的构造方法
$this->phone = $param;
}
function display() {
echo "Name: " . $this->name . "<br>";
echo "Password: " . $this->password . "<br>";
echo "Phone: " . $this->phone . "<br>";
echo "Email: " . $this->email . "<br>";
}
function test() {
echo "I'm your son.";
}
function test2() {
parent::test(); // parent 关键词调用的是父元素的同名函数
}
}
$objex = new Subscriber("1881099****");
$objex -> name = "ma**";
$objex -> password = "456";
$objex -> email = "82791***@qq.com";
$objex -> display(); // 输出所有属性
$objex -> test(); // 输出 I'm your son.
$objex -> test2(); // 输出 I'm your father.
?>
可以针对程序查看对应输出: