PHP 类与对象!


1.实例化类时,需要用 :: 调用常量

class MyClass3{
    const CONST_VALUE = 'A constant value';
}

$obj3 = new MyClass3();
echo $obj3::CONST_VALUE;

2.使用静态方法或者静态变量 可以不实例化直接用类名 必须使用 :: 调用

class MyClass4
{
  public static $my_static = '静态方法的变量<br>';

  public static function doubleColon() {
    echo self::$my_static . "\n";
  }
}

echo MyClass4::$my_static;
MyClass4::doubleColon();

 

3.抽象类和抽象方法说明

(1).抽象类不能被实例化

(2).抽象类中至少有一个方法是被声明为抽象的

(3).抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

(简单来说,也就是只能定义抽象方法的名称,不能在里面写逻辑处理)

(4).继承一个抽象类的时候,子类必须定义父类中的所有抽象方法

(5).子类重定义父类抽象方法时,声明等级必须大于等于父类

(6).子类可以定义父类中不存在的可选参数

(7).附属知识点 花括号来界定变量名的边界 "{}"

abstract class AbstractClass
{
 // 强制要求子类定义这些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . "\n";
    }
}

class ConcreteClass1 extends AbstractClass
{
    public function getValue() {
        return "重定义父类的抽象方法";
    }

    public function prefixValue($prefix,$xinxin="") {
        return "{$prefix}重定义父类的抽象方法{$xinxin}哈哈";
    }
}

$obj5 = new ConcreteClass1();
echo $obj5->getValue();
echo "<br>";
echo $obj5->prefixValue("多加个参数 "," 新的参数");

 

4.对象接口

(1)接口中所有的方法都是空的

(2)接口中定义的所有方法都必须是公有,也就是 public

(3)类要实现接口,必须实现接口中所有的方法,并且,方法中参数必须一模一样,不能少也不能多

(4)接口也可继承接口(同样用extends),并且,类与接口都可以继承多个接口

(5)接口中的常量不可被覆盖,不管是子类还是子接口

  interface iTemplate1
    {
        public function setVariable($name, $var);
    }

    interface iTemplate2
    {
        public function getHtml($template);
    }

    class Template implements iTemplate1,iTemplate2
    {

        public function setVariable($name, $var)
        {
           return $name.$var;
        }
      
        public function getHtml($template)
        {
            return $template;
        }
    }

    $obj6 = new Template();
    echo $obj6->setVariable("姓名","变量");
    echo "<br>";
    echo $obj6->getHtml("代码");

5.类的简洁用法,实例化同样的类,二者不完全相等!

    class Niming{

        public function func1()
        {
            echo "fun1";
        }

        public function func2()
        {
            echo "fun2";
        }

    }

    (new Niming())->func1();

    if((new Niming()) !== (new Niming())){
        echo "不相等";
    }

    if((new Niming()) == (new Niming())){
        echo "相等";
    }

 6.遍历对象只能遍历公开的变量(属性),也就是 public

7.部分魔术方法 __set,__get

class C {

    public $set = "";

    private $a = "hehehe";

    public function __set($name, $value) 
    {
        $this->set = "私有的,不给写入";
        return $this->set;
    }

    public function __get($name) 
    {
        $this->set = "私有的,不给访问";
        return $this->set;
    }
}

$c = new C();
$c->a = 999;
var_dump($c->set);
var_dump($c->a);

8.final

(1)子类无法覆盖父类中的 final 方法

(2)final 类无法被继承

(3)属性不能被定义为 final,只有类和方法才能被定义为 final

    class BaseClass {
       public function test() {
           echo "111";
       }
       
       final public function moreTesting() {
           echo "222";
       }
    }

    class ChildClass extends BaseClass {

        //不能覆盖 Fatal error: Cannot override final method BaseClass::moreTesting()
        // public function moreTesting() {
     //         echo "999";
     //           echo Parent::moreTesting();
     //     }

        public function moreTesting1() {
            echo "999";
               echo Parent::moreTesting();
        }

    }

    $obj = new ChildClass();
    $obj->moreTesting1();
    final class Abc {
        function a(){
            echo "a";
        }
    }

    //不能继承 Fatal error: Class ClassName may not inherit from final class (Abc)
    // class ClassName extends Abc
    // {
    //     function aa(){
    //         echo "aa";
    //     }
    // }

 9.类型约束

(1)类的方法 里面的参数,可以约束类型

(2)如果一个类或接口指定了类型约束,则其所有的子类或实现也都如此

class MyClass
{
    /**
     * 测试函数
     * 第一个参数必须为 OtherClass 类的一个对象
     */
    public function test(OtherClass $otherclass) {
        echo $otherclass->var;
    }

    /**
     * 另一个测试函数
     * 第一个参数必须为数组 
     */
    public function test_array(array $input_array) {
        print_r($input_array);
    }
}

// OtherClass 类定义
class OtherClass {
    public $var = 'Hello World';
}

class Class2 extends MyClass{
    public function test(OtherClass $otherclass) {
        echo $otherclass->var;
    }
}

$obj1 = new MyClass();
$obj2 = new OtherClass();
// $obj1->test("123");  //错误用法
$obj1->test($obj2);
$array = array(1,2,3,4,5);
// $obj1->test_array("123");
$obj1->test_array($array);
$obj3 = new Class2();
$obj3->test($obj2);

 

posted @ 2017-12-06 11:54  无语凝噎6666  阅读(203)  评论(0)    收藏  举报