首页 > 代码库 > PHP类与面向对象

PHP类与面向对象

PHP常量
PHP常量大写
PHP常量用define函数或const关键字定义
一个常量一旦被定义,就不能再改变或者取消定义。
在 PHP 5.3.0 以后,可以使用 const 关键字在类定义之外定义常量。

预定义常量:
__LINE__
__FILE__

define("FOO1", "something1");define("FOO2", "something2");define("FOO3", "something3");const CONSTANT = ‘FOO‘;echo FOO1;echo ‘<br/>‘;echo FOO2;echo ‘<br/>‘;echo FOO3;echo ‘<br/>‘;echo CONSTANT;

 

PHP5魔术常量
__LINE__,文件中的当前行号
__FILE__,文件的完整路径和文件名
__DIR__,文件所在的目录
__FUNCTION__,函数名称
__CLASS__,类的名称
__TRAIT__,Trait的名字
__METHOD__,类的方法名
__NAMESPACE__,当前命名空间的名称

header(‘Content-Type: text/html; charset=utf-8‘);echo ‘魔术常量‘;echo ‘<br/>‘;echo ‘当前行号:‘.__LINE__;echo ‘<br/>‘;echo ‘文件的完整路径和文件名:‘.__FILE__;echo ‘<br/>‘;echo ‘文件所在的目录:‘.__DIR__;echo ‘<br/>‘;function my_test() {    echo ‘当前函数的名字:‘.__FUNCTION__;}my_test();echo ‘<br/>‘;class my_class {    public $name = __CLASS__;}$my_class = new my_class();echo ‘当前类的名字:‘.$my_class -> name;echo ‘<br/>‘;

 

PHP运算符

PHP控制语句

$a = 5;$b = 3;if ($a > $b)echo "a is bigger than b";

 

$people = Array(    Array(‘name‘ => ‘namea‘, ‘salt‘ => 1111),    Array(‘name‘ => ‘nameb‘, ‘salt‘ => 2222));for($i = 0, $size = sizeof($people); $i < $size; $i++) {    $people[$i][‘salt‘] = rand(0000, 9999);}var_dump($people);

 

$arr = array(1, 2, 3, 4);foreach($arr as &$value) { // 必须写引用,不然执行下面代码块的东西会报错    $value = $value * 2;    echo $value .‘<br/>‘;}var_dump($arr);echo ‘<br/>‘;unset($value); // 取消掉引用var_dump($arr);

 

break语句
break 结束当前 for,foreach,while,do-while 或者 switch 结构的执行。 break 可以接受一个可选的数字参数来决定跳出几重循环。
break 可以接受参数,停止几个结构的执行,默认是1

$arr = array(‘one‘, ‘two‘, ‘three‘, ‘four‘, ‘stop‘, ‘five‘);while (list(, $var) = each($arr)) {    if ($var == ‘stop‘) {        break;    }    echo "$var<br/>";}$i = 0;while(++$i) {    switch($i) {        case 5:            echo ‘At 5 <br/>‘;            break 1; // 只退出switch        case 10:            echo ‘At 10 <br/>‘;            break 2; // 退出switch和while        default:            break;    }}

 

continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾。默认值是 1

declare语句
什么是低级语句呢?它包括:
简单语句:空语句(就一个;号),return, break, continue, throw, goto, global, static, unset, echo, 内置的HTML文本,分号结束的表达式等均算一个语句。
复合语句:完整的if/elseif, while, do...while, for, foreach, switch, try...catch等算一个语句。
语句块:{} 括出来的语句块。
最后特别的:declare块本身也算一个语句(按道理declare块也算是复合语句,但此处特意将其独立出来)。

declare(ticks=1); // 低级语句// A function called on each tick eventfunction tick_handler(){    echo "tick_handler() called<br/>"; // 低级语句}register_tick_function(‘tick_handler‘); // 低级语句$a = 1; // 低级语句if ($a > 0) {    $a += 2; // 低级语句    print($a); // 低级语句}

 

function do_tick(){    echo "<b style=‘color:red;‘>do_tick_function</b><br>";}register_tick_function(‘do_tick‘);declare(ticks = 1){    for($i = 1; $i < 5; $i++)    {        echo "<b style=‘color:blue;‘>{$i}</b><br>";    }}

 

include 语句包含并运行指定文件。没找到只会发出一条警告。
require 没找到会发生一个致命的错误

vars.php

$color = ‘green‘;$fruit = ‘apple‘;

 

test.php

echo "A $color $fruit";include ‘vars.php‘;echo "A $color $fruit";

 

php 函数
(和js函数基本雷同)

类与对象

class A {    function foo()    {        if(isset($this)) {            echo ‘$this is defined‘ . get_class($this);            // get_class()返回类名        } else {            echo ‘$this is not defined‘;        }    }}$a = new A();$a -> foo();

 

继承
PHP不支持多重继承,一个类只能继承一个基类。
被继承的方法和成员可以通过用同样的名字重新声明被覆盖,除非父类定义方法时使用了 final 关键字。可以通过 parent:: 来访问被覆盖的方法或成员。

class SimpleClass {    // 成员声明    public $var = ‘a default value‘;    // 方法声明    public function displayVar() {        echo $this->var;        echo ‘<br/>‘;    }}$simple_class = new SimpleClass();$simple_class -> displayVar();class ExtendClass extends SimpleClass {    // 重写父类方法    function displayVar()    {        echo ‘extend class: ‘;        parent::displayVar(); // TODO: Change the autogenerated stub    }}$extended = new ExtendClass();$extended -> displayVar();

 

属性修饰符:public,protected,private


类常量

// 类常量class MyClass {    const CONSTANT = ‘constant value‘;    // PHP5.3.0之后    const bar = <<<‘EOT‘    BAREOT;    public function showConstant() {        echo self::CONSTANT.‘<br/>‘;    }}$my_class = new MyClass();$my_class -> showConstant();// 直接访问类常量echo MyClass::CONSTANT;echo ‘<br/>‘;// PHP5.3.0之后echo $my_class::CONSTANT;echo ‘<br/>‘;echo MyClass::bar;

 

自动加载类
很多开发者写面向对象的应用程序时,对每个类的定义建立一个PHP 源文件。一个很大
的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表。
在软件开发的系统中,不可能把所有的类都写在一个PHP 文件中,当在一个PHP 文件
中需要调用另一个文件中声明的类时,就需要通过include 把这个文件引入。不过有的时候,
在文件众多的项目中,要一一将所需类的文件都include 进来,是一个很让人头疼的事,所以
我们能不能在用到什么类的时候,再把这个类所在的PHP 文件导入呢?这就是我们这里我们
要讲的自动加载类。
在PHP5 中,可以定义一个__autoload()函数,它会在试图使用尚未被定义的类时自动调
用,通过调用此函数,脚本引擎在PHP 出错失败前有了最后一个机会加载所需的类,
__autoload()函数接收的一个参数,就是你想加载的类的类名,所以你做项目时,在组织定义
类的文件名时,需要按照一定的规则,最好以类名为中心,也可以加上统一的前缀或后缀形
成文件名,比如xxx_classname.php、classname_xxx.php 以及就是classname.php 等等。
本例尝试分别从MyClass1.php 和MyClass2.php 文件中加载MyClass1 和MyClass2 类

MyClass1.php

class MyClass1 {    public function className()    {        echo get_class($this);    }}

 


MyClass2.php

class MyClass2 {    public function className()    {        echo get_class($this);    }}

 

 

demo01.php

// 自动加载类function __autoload($class_name){    require_once $class_name . ‘.php‘;}$obj = new MyClass1();$obj2 = new MyClass2();$obj->className();echo ‘<br/>‘;$obj2->className();

 

PHP类与面向对象