PHP -- 类语法

1.类成员语法

<?php

class 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. 类命名空间

 <?php

namespace 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 抽象

// 类似于java
abstract 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'接口,类似于java
interface 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 延迟静态绑定

延迟到方法执行时,才绑定。
<?php

class 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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值