1、PHP魔术变量
PHP向它运行的任何脚本提供了大量的预定义常量,有不同扩展库定义,需要加载这些扩展库,或动态加载后,或编译时已经包括。有八个魔术常量的值随在代码中的位置改变而改变。
(1)__LINE__:文件中的当前行号
(2)__FILE__:文件的完整路径和文件名,绝对路径。
如果用在被包含文件中,则返回被包含的文件名。(?)
(3)__DIR__:文件所在的目录。等价于dirname(__FILE__)。
除非是根目录,否则不包括末尾斜杠。
(4)__FUNCTION__:函数名称(在函数内使用)。
(5)__CLASS__:类的名称。
";
echo '函数名为:' . __FUNCTION__ ;
}
}
$t = new test();
$t->_print();
?>
(6)__TRAIT__:Trait的名字。自从PHP 5.4.0起,PHP实现了代码复用的一个方法,称为traits。
从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
sayHello();
?>
输出:Hello World!
(7)__METHOD__:类的方法名。
(8)__NAMESPACE__:当前命名空间的名称。
2、命名空间(namespace)
(1)意义
防止用户编写代码与PHP内部的类/函数/常量或第三方的名字冲突
为很长的标识符名称创建一个简短的别名,提高源代码的可读性
(2)定义——namespace
declare(encoding='UTF-8');//定义多个命名空间和不包含在命名空间中的代码namespace MyProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }}namespace { // 全局代码session_start();$a = MyProject\connect();echo MyProject\Connection::start();}?>
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的declare语句。
所有非PHP代码包括空白符都不能出现在命名空间的生命之前。
” 会致命错误 - 命名空间必须是程序脚本的第一条语句
?>
以上代码会出现错误。
(3)子命名空间:namespace MyProject\Sub\Level
(4)命名空间的使用
命名空间中的类名通过一下三种方式引用:
第一种:非限定名称(不包含前缀的类名称)
例如,$a=new foo();。如果当前命名空间是currentnamespace,foo将被解析为currentnamespace\foo;如果使用foo代码是全局的,则foo会被解析为foo。注意,如果命名空间中没有定义,则会被解析为全局变量。
第二种:限定名称(包含前缀)
例如,$a=new subnamespace\foo();。
如果当前命名空间是currentnamespace,foo将被解析为currentnamespace\subnamespace\foo;如果使用foo代码是全局的,则foo会被解析为subnamespace\foo。
第三种:完全限定名称(包含全局前缀操作符)
例如,
$a=new \currentnamespace\foo();。在这种情况下,foo总是被解析为代码中的文字名。
(5)命名空间和动态语言特征
(6)namespace关键字和__NAMESPACE__常量
常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包含在任何命名空间中的代码,它包含一个空字符串。
__NAMESPACE__动态创建名称
namespace关键字可以用来显式访问当前命名空间或子命名空间中的元素。
例如,namespace MyProject; namespace\func(); // calls function MyProject\func()
(7)使用命名空间:别名/导入——为类名称使用别名,或为命名空间使用别名
PHP中,别名是通过use操作符实现的。
……
3、面向对象
(1)面向对象内容
类、对象、成员变量、成员函数
继承、父类、子类
多态、重载
抽象性
封装
构造函数、析构函数
(2)类的定义
url = $par; //变量$this代表自身的对象 } function getUrl(){ echo $this->url . PHP_EOL; //PHP_EOL为换行符 } }
(3)创建对象——new
(4)构造函数
void __constrcut(...)
(5)析构函数——当对象结束其声明周期时,系统自动执行析构函数
void __destruct(void)
name = "MyDestructableClass";
}
function __destruct() {
print "销毁 " . $this->name . "\n";
}
}
$obj = new MyDestructableClass();
?>
(6)继承——extends
PHP不支持多继承。可以扩展功能。
(7)方法重写
如果从父类继承的方法不能满足子类的需求,可以进行改写——方法的覆盖(方法的重写)
4、访问控制
通过在属性或方法前面添加关键字,默认为公有。
public(公有):可以在任何地方被访问。
protected(受保护):可以被其自身以及其子类和父类访问。
private(私有):只能被其定义所在类访问。
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
?>
5、接口——interface
指定某个类必须实现那些方法,但不需要定义这些方法的具体内容。接口中定义的所有方法都是公有的。
实现一个接口,使用implements操作符,类中必须实现接口中定义的所有方法。
类可以实现多个接口。
6、常量
定义使用常量时候不需要使用$符号,必须是一个定值,const定义。
7、抽象类——abstract
任何一个类,如果至少有一个方法时抽象的,则这个类必须声明为抽象类。
抽象类不能被实例化。
抽象方法只声明其调用方式(参数),不定义具体功能实现。
继承抽象类,子类必须定义父类中所有抽象方法,访问控制一样或更宽松。方法的调用方式必须匹配。
8、Static关键字
声明类属性或方法为static(静态),就可以不实例化类而直接访问。
静态属性不能通过一个类以实例化对象来访问,但静态方法可以。
$this在静态方法中不可用,因为静态方法不需要通过对象即可调用。
staticValue() . PHP_EOL;
?>
9、Final关键字
如果父类中的方法被声明为final,则子类无法覆盖该方法。如果一个类被声明为final,则不能被继承。
10、调用父类构造方法
子类构造方法中不会自动调用父类构造方法。要执行父类构造方法,需要在子类的构造方法中调用parent::__construct()。
输出: