PHP -- 类语法

来源:互联网 发布:福建随行软件操作手册 编辑:程序博客网 时间:2024/06/06 00:18

1.类成员语法

<?phpclass A{    /* 访问修饰符     * java中有公用 私有 包类可见(受保护) 空(介于公用和私有之间)     * php 只有三个 public private protected 不能为空     * */    public $i = 5;    public static $y = "static string\n";    /* 构造方法     * */    function __construct(){        echo "这是构造方法\n";    }    function fn(){        /* 方法内部无法访问字段,必须配合this         * 类似js中方法访问内部字段需要使用this         * */        echo $this -> i;        echo '这是一个方法';    }    /* 静态方法     * self指向本类(可以在静态/非静态)     * $this指向本类(只能在非静态使用)     * */    static function fn_2(){        echo self::$y;//相当于外部调用(A::$y)        echo "这是一个静态方法\n";    }}/* 静态方法调用 * */A ::fn_2();echo A::$y;$a = new A();/* 不可思议之一 -- 多次调用构造方法 * */$a -> __construct();//print_r($a);//$a->fn();/* 如js一样动态添加属性/方法 * */$a->x = 'test add';echo $a->x;echo "\n";/* 删除$a中的一个元素 * */unset($a->x);/* 此遍历相当于js中的for in * */foreach($a as $k=>$v){    echo "$k:$v\n";}

2. 类命名空间

 <?phpnamespace a\b\c;class A{    public $i = '这是A';}namespace a\b\d;/* 导入上个命名空间的class A(use 路径) * use as 用来解决命名空间中类名冲突 * new A()就是d下的A,想得到c下的A就new CA(); * *///use a\b\c\A;use a\b\c\A as CA;class A{    public $b = '这是B';}$a = new CA();print_r($a);

3. 类语法 – 多态

3.1 继承

<?php/* 类似与java final修饰后不能继承/重写 * */class A{    public $text = "测试父类继承";    function __construct()    {        echo "创建了一个A\n";    }    function fn()    {        echo "这是父亲的方法\n";    }}class B extends A{    /* 在java中 构造方法不会被重写,不会被继承     * 在构造方法中调用父类构造方法,用super(),且只能调用一次且放在首行。     *     * 在js中 子类不能写构造方法。但是能被继承     *     * 在php中 构造方法会被重写,会被继承。     * 在构造方法中调用父类构造方法,用parent::(无次数,位置限制)     * */    function __construct()    {        parent::__construct();        parent::__construct();        echo "创建了一个B\n";    }    function fn()    {        /* java调用父类的方法是 super.fn();         * js super.fn();         * php 见下 parent::fn();         * */        parent::fn();        echo "这是重写A的方法";    }}$b = new B();$b->fn();//print_r($b);

3.2 抽象

// 类似于javaabstract class AbstractClass{    // 强制要求子类定义这些方法    abstract protected function getValue();    abstract protected function prefixValue($prefix);    // 普通方法(非抽象方法)    public function printOut() {        print $this->getValue() . "\n";    }}class ConcreteClass1 extends AbstractClass{    protected function getValue() {        return "ConcreteClass1";    }    public function prefixValue($prefix) {        return "{$prefix}ConcreteClass1";    }}$class1 = new ConcreteClass1;$class1->printOut();echo $class1->prefixValue('FOO_') ."\n";

3.3 接口

<?php// 声明一个'iTemplate'接口,类似于javainterface iTemplate{    public function setVariable($name, $var);    public function getHtml($template);}// 实现接口// 下面的写法是正确的class Template implements iTemplate{    public $lists = array();    public function setVariable($name, $var)    {        $this->lists[$name] = $var;    }    public function getHtml($template)    {        echo "{$template}";    }}$template = new Template();$template->getHtml('测试');$template->setVariable('张三', '250');echo $template->lists['张三'];

3.4 延迟静态绑定

延迟到方法执行时,才绑定。
<?phpclass A{    const XX ="这是A的常量\n";    public function fn(){        /* 使用self:: 会绑定A中的常量XX         * 使用static:: 延迟静态绑定为B的常量XX         * (B中有常量XX,若无为A中的常量)         * */        echo static::XX;    }}class B extends A{    const XX ="这是B的常量\n";}$b = new B();$b->fn();5.5 流程处理函数die/exit 退出    include        eg: include 'URL';    include_once        ps:用法和includ一样,主要用于区别函数的两次导入会报错    require,require_once        ps:用法和include一样,但是include出错是警告,require会终止程序执行。    return 返回值;        ps:在函数中使用global $ireturn $i一样/* 老版本的php加载其他php方式 * 要求 文件名和类名必须一致 * 新版本 spl_autoload_register(); * */function __autoload($cn){    return "$cn.php";}spl_autoload_register();