Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:static有好几种用法呢
<?php
function echobr($param = '')
{
echo $param . '<br>';
}
function dumpbr($param = '')
{
var_dump($param);
echo '<br>';
}
function printfpre($param = '')
{
printf('<pre>%s</pre>', print_r($param, true));
}
/** file1.php*/
<h2>你好,这里是file1.php</h2>
/** file2.php */
<h2>你好,这里是file2.php</h2>
// test1: 文件加载的路径值支持的类型
/* 1. 字面量 */
include 'file1.php';
/* 2. 变量 */
$path = 'file1.php';
include $path;
/* 3. 带变量的双引号字符串 */
include "{$path}";
/* 4. 表达式 */
$filename = 'file1';
include $filename . '.php';
/* 5. 采用类似调用函数的形式 */
include('file1.php');
// test2: 相同文件只加载一次
/* 加载多次file2.php文件, 实际只第一次成功加载, 后面的都被忽略了 */
include_once 'file2.php';
include_once 'file2.php';
include_once 'file2.php';
// test2: 加载不存在的文件, 并不会中断程序的执行.
include 'file256.php';
echobr('<h2>没有事, 程序照常执行, 要不想显示警告信息, 加上@</h2>');
// test1:
/* 1. 字面量 */
require 'file1.php';
/* 2. 变量 */
$path = 'file1.php';
require $path;
/* 3. 带变量的双引号字符串 */
require "{$path}";
/* 4. 表达式 */
$filename = 'file1';
require $filename . '.php';
/* 5. 采用类似调用函数的形式 */
require('file1.php');
// test2: 加载相同文件一次
require_once 'file2.php';
require_once 'file2.php';
require_once 'file2.php';
// test3: 加载不存在的文件
require 'file256.php';
/*
Warning: require(file256.php): failed to open stream: No such file or directory in D:\phpstudy_pro\WWW\php11\PHP\0427\homework\homework.php on line 61
Fatal error: require(): Failed opening required 'file256.php' (include_path='.;C:\php\pear') in D:\phpstudy_pro\WWW\php11\PHP\0427\homework\homework.php on line 61
*/
echobr('<h2>本内容无法打印输出</h2>');
/** file3.php */
<?php
$filename = 'file3.php';
function fileName()
{
return 'function ' . __FUNCTION__ . ' return : file3.php';
}
// 当前是全局作用域
require 'file3.php';
require 'file3.php';
echobr(fileName());
/*
不能打印fineName()函数的返回值, 因为加载了两次file3.php, 相当于在全局作用域定义了两次fileName()函数.
result: Fatal error: Cannot redeclare fileName() (previously declared in D:\phpstudy_pro\WWW\php11\PHP\0427\homework\file3.php:6) in D:\phpstudy_pro\WWW\php11\PHP\0427\homework\file3.php on line 7
*/
// 名称空间中引入
namespace np1 {
require '../../out.php';
require 'file3.php';
echobr(fileName());
/*
result : function fileName return : file3.php
*/
echobr($filename ?? 'np1_没有名字');
}
// 全局作用域引入
namespace {
echobr(fileName());
/*
result : function fileName return : file3.php
*/
echobr($filename ?? 'global_没有名字');
}
namespace np2 {
echobr(fileName());
/*
result: function fileName return : file3.php
*/
echobr($filename ?? 'np2_没有名字');
}
require '../../out.php';
function func()
{
require('file3.php');
// 函数是全局的, 所以都可以访问
echobr(fileName());
echobr($filename ?? 'func_没有名字');
}
func();
// 函数是全局的, 所以可以访问
echobr(fileName());
// filename变量是函数域中引入的, 在函数域中才克访问
echobr($filename ?? 'global_没有名字');
class
来声明类
class Class1 {
// todo...
}
new
来创建类的实例
$cls1 = new Class1;
instanceof
判断对象是否为某个类的实例
$cls1 = new Class1;
echobr('对象$cls1' . (($cls1 instanceof Class1) ? '是' : '不是') . 'Class1类的实例');
/*
result: 对象$cls1是Class1类的实例
*/
get_class
函数获取对象的类名
$cls1 = new Class1;
echobr('对象$cls1是' . get_class($cls1) . '类的实例');
/*
result: 对象$cls1是Class1类的实例
*/
$className = 'Class1';
$cls1 = new $className;
dumpbr($cls1);
/*
result: object(Class1)#2 (0) { }
*/
类的成员包括: 类属性, 类方法, 类常量
self
关键字来代表类本身;用$this
变量来代表当前对象.->
来访问类的常规属性, 访问方式:对象->属性名
仅限public
的属性$this->属性名
可以访问类中定义的所有属性::
来访问类的静态属性/常量, 访问方式:类名::静态属性
; 类名::常量
self::静态变量
; self::常量
/** 声明类属性、类外部访问类属性demo */
<?php
require('../../out.php');
class Employee
{
// 1. 常规属性
/* 字符串 */
public $name = '张三';
/* 数字 */
public $age = 25;
/* 布尔 */
public $marriage = false;
/* 字面量数组 */
public $like = ['编程', '游泳', '旅游', '日漫'];
/* 长文本1 */
public $introduce = <<< EOP
介绍, 长文本
介绍, 长文本
介绍, 长文本
介绍, 长文本
...
EOP;
/* 长文本2 */
public $education = <<< 'EOP'
教育经历, 长文本
教育经历, 长文本
教育经历, 长文本
教育经历, 长文本
...
EOP;
/* 2. 常量 */
const HELLO = 'Hello';
/* 3. 静态属性 */
public static $empoyeeTotal = 200;
/* 4. 抽象属性 */
public $fireDate;
/* 不能用[变量/类属性/表达式/函数]作为类属性赋默认值 */
}
// 访问类属性
$emp = new Employee;
// 访问常规属性
echobr("员工姓名: {$emp->name}, 年龄: {$emp->age}岁, 婚否: " . ($emp->marriage ? '已婚' : '未婚') . ", 爱好: " . join('/', $emp->like));
echobr("自我介绍: {$emp->introduce}");
echobr("教育经历: {$emp->education}");
echobr('------');
// 访问常量/静态属性
echobr("打招呼: " . Employee::HELLO);
echobr("员工总数: " . Employee::$empoyeeTotal);
// 抽象属性的默认值是null
dumpbr($emp->fireDate);
/*
result:
员工姓名: 张三, 年龄: 25岁, 婚否: 未婚, 爱好: 编程/游泳/旅游/日漫
自我介绍: 介绍, 长文本 介绍, 长文本 介绍, 长文本 介绍, 长文本 ...
教育经历: 教育经历, 长文本 教育经历, 长文本 教育经历, 长文本 教育经历, 长文本 ...
------
打招呼: Hello
员工总数: 200
NULL
*/
include/require
和 include_once/require_once
完成的功能基本一样。前一组可以多次加载同一个文件,适合加载在相同页面多次用到代码文件,如HTML组件等。后一组同一个文件只加载一次,适合加载各种脚本文件,如js脚本文件,PHP脚本文件等。include/include_once
和require/require_once
是有区别的。前一组加载不到目标文件时,并不会导致致命错误,不影响程序的正常执行。使用@
可忽略其输出的警告。适合用来加载非不可或缺的文件。后一组加载不到目标文件时,会导致知名错误,程序会停止往下执行。适合用来加载不可或缺的文件。->
来访问类的常规属性, 访问方式:对象->属性名
仅限public
的属性$this->属性名
可以访问类中定义的所有属性::
来访问类的静态属性/常量, 访问方式:类名::静态属性
; 类名::常量
self::静态变量
; self::常量