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

浙公网安备 33010602011771号