PHP学习笔记(三)

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()。

输出:
PHP学习笔记(三)_第1张图片

你可能感兴趣的:(PHP学习笔记(三))