kuangweijian
3 years ago
16 changed files with 438 additions and 20 deletions
-
2007面向对象/01.php
-
9607面向对象/01继承.php
-
607面向对象/02命名空间/01显示当前的命名空间.php
-
1807面向对象/02命名空间/02使用命名空间/file1.php
-
3307面向对象/02命名空间/02使用命名空间/file2.php
-
5407面向对象/02命名空间/03use的使用/demo.php
-
1807面向对象/02命名空间/03use的使用/file.php
-
5907面向对象/03工场模式--创建对象的类.php
-
307面向对象/04单例模式.php
-
1407面向对象/05魔术方法/__get.php
-
1407面向对象/05魔术方法/set.php
-
2207面向对象/06抽象类.php
-
3907面向对象/07接口.php
-
3007面向对象/08最终类final.php
-
1507面向对象/09克隆clone.php
-
1707面向对象/10判断对象是否属于某个类.php
@ -1,20 +0,0 @@ |
|||
<?php |
|||
class students |
|||
{ |
|||
var $name; |
|||
public $age; |
|||
private $sex; |
|||
public static $school; |
|||
public function Write(string $a, int $b):bool{ |
|||
|
|||
} |
|||
|
|||
protected static function Read(string $str):int { |
|||
|
|||
} |
|||
|
|||
function Listen(int $num):bool{ |
|||
|
|||
} |
|||
} |
|||
?>
|
@ -0,0 +1,96 @@ |
|||
<?php |
|||
|
|||
//继承父类中的publc成员demo
|
|||
class classParent |
|||
{ |
|||
public function __construct() |
|||
{ |
|||
echo '--进入父类--'.'<br>'; |
|||
} |
|||
|
|||
public function demo() //public 成员
|
|||
{ |
|||
echo '--父类 方法--'.'<br>'; |
|||
} |
|||
|
|||
public function __destruct() |
|||
{ |
|||
echo '--推出父类--'.'<br>'; |
|||
} |
|||
} |
|||
|
|||
class son extends classParent |
|||
{ |
|||
public function __construct() |
|||
{ |
|||
echo '--进入子类--'.'<br>'; |
|||
} |
|||
|
|||
public function __destruct() |
|||
{ |
|||
echo '--退出子类--'.'<br>'; |
|||
} |
|||
} |
|||
|
|||
// $obj = new son();
|
|||
// $obj -> demo();
|
|||
|
|||
|
|||
/*继承父类中的保存成员*/ |
|||
|
|||
class parent2 |
|||
{ |
|||
public function __construct() |
|||
{ |
|||
echo '--进入父类--'.'<br>'; |
|||
} |
|||
|
|||
protected function demo() |
|||
{ |
|||
echo '父类保护成员'.'<br>'; |
|||
} |
|||
|
|||
public function __destruct() |
|||
{ |
|||
echo '--退出父类--'.'<br>'; |
|||
} |
|||
} |
|||
|
|||
class son2 extends parent2{ |
|||
public function __construct() |
|||
{ |
|||
echo '--进入子类--'.'<br>'; |
|||
} |
|||
|
|||
public function test() |
|||
{ |
|||
echo '子类公共成员'.'<br>'; |
|||
$this -> demo(); //这个this是指子son2;
|
|||
} |
|||
|
|||
public function __destruct() |
|||
{ |
|||
echo '--退出子类--'.'<br>'; |
|||
} |
|||
} |
|||
|
|||
|
|||
// $obj = new son2();
|
|||
// $obj -> test();
|
|||
|
|||
/*继承父类中的私有成员*/ |
|||
class parent3{ |
|||
private function func(){ |
|||
echo '父类私有成员'.'<br>'; |
|||
} |
|||
} |
|||
|
|||
class son3 extends parent3{ |
|||
public function test(){ |
|||
$this -> func(); //会报错
|
|||
} |
|||
} |
|||
|
|||
$obj=new son3(); |
|||
$obj -> test(); |
|||
?>
|
@ -0,0 +1,6 @@ |
|||
<?php |
|||
namespace foo\bar\demo; |
|||
|
|||
echo '命名空间为'.__NAMESPACE__; |
|||
|
|||
?>
|
@ -0,0 +1,18 @@ |
|||
<?php |
|||
namespace Foo\Bar\subnamespace; |
|||
|
|||
const FOO = 1; |
|||
|
|||
function foo() { |
|||
echo '命名空间:'.__NAMESPACE__.'--函数:foo'.'<br>'; |
|||
} |
|||
|
|||
class foo |
|||
{ |
|||
// public function demo() {
|
|||
//如果使用public,会报错Fatal error: Uncaught Error: Non-static method Foo\Bar\subnamespace\foo::demo() cannot be called statically in
|
|||
static function demo() { |
|||
echo '命名空间为:'.__NAMESPACE__.'--类foo的方法demo'.'<br>'; |
|||
} |
|||
} |
|||
?>
|
@ -0,0 +1,33 @@ |
|||
<?php |
|||
namespace Foo\Bar; |
|||
include 'file1.php'; |
|||
|
|||
const FOO = 2; |
|||
|
|||
function foo() { |
|||
echo '命名空间:'.__NAMESPACE__.'--函数:foo'.'<br>'; |
|||
} |
|||
|
|||
class foo |
|||
{ |
|||
static function demo() { |
|||
echo '命名空间为:'.__NAMESPACE__.'--类foo的方法demo'.'<br>'; |
|||
} |
|||
} |
|||
|
|||
/* 非限定名称 */ |
|||
foo(); // 解析为函数 Foo\Bar\foo
|
|||
foo::demo(); // 解析为类 Foo\Bar\foo 的静态方法 staticmethod
|
|||
echo '命名空间为:'.__NAMESPACE__.'--常量FOO:'.FOO.'<br>'; // 解析为常量 Foo\Bar\FOO
|
|||
|
|||
/* 限定名称 */ |
|||
subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo
|
|||
subnamespace\foo::demo(); // 解析为类 Foo\Bar\subnamespace\foo,
|
|||
// 以及类的方法 staticmethod
|
|||
echo '命名空间为:'.__NAMESPACE__.'--常量FOO:'.subnamespace\FOO.'<br>'; // 解析为常量 Foo\Bar\subnamespace\FOO
|
|||
|
|||
/* 完全限定名称 */ |
|||
\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo
|
|||
\Foo\Bar\foo::demo(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
|
|||
echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO
|
|||
?>
|
@ -0,0 +1,54 @@ |
|||
<?php |
|||
//命名空间a
|
|||
namespace a |
|||
{ |
|||
const const_a=1; //常量a
|
|||
|
|||
function func_a() |
|||
{ |
|||
echo __FUNCTION__.'<br>'; |
|||
} |
|||
|
|||
class cls_a |
|||
{ |
|||
static function func() |
|||
{ |
|||
echo __CLASS__.'--'.__FUNCTION__.'<br>'; |
|||
} |
|||
} |
|||
} |
|||
|
|||
//命名空间b
|
|||
namespace b |
|||
{ |
|||
//导入类
|
|||
use a\cls_a as cls_b; //导入命名空间a\b\c的类cls_a,设置别名cls_a
|
|||
|
|||
$obj=new cls_b; |
|||
$obj -> func(); |
|||
|
|||
//导入函数
|
|||
use function a\func_a; |
|||
func_a(); |
|||
|
|||
//导入常量
|
|||
use const a\const_a; |
|||
echo const_a.'<br>'; |
|||
} |
|||
|
|||
namespace c |
|||
{ |
|||
//导入命名空间
|
|||
use a as aa; |
|||
|
|||
echo aa\const_a.'<br>';; |
|||
|
|||
aa\func_a(); |
|||
|
|||
$obj=new aa\cls_a(); |
|||
$obj -> func(); |
|||
} |
|||
|
|||
//感悟:命名空间就像在一个文件中把其中一筐代码框住,放在一个空间中,当要使用是就用use导入
|
|||
//注意:导入不同文件的命名空间需要用iclude'file'
|
|||
?>
|
@ -0,0 +1,18 @@ |
|||
<?php |
|||
namespace a; |
|||
|
|||
const const_a=1; //常量a
|
|||
|
|||
function func_a() |
|||
{ |
|||
echo __FUNCTION__,"\n"; |
|||
} |
|||
|
|||
class cls_a |
|||
{ |
|||
static function func() |
|||
{ |
|||
echo __CLASS__.'-'.__FUNCTION__.'\n'; |
|||
} |
|||
} |
|||
?>
|
@ -0,0 +1,59 @@ |
|||
<?php |
|||
|
|||
use a\cls_a; |
|||
|
|||
class add{ |
|||
public function getVal($n,$m){ |
|||
return $n + $m; |
|||
} |
|||
} |
|||
|
|||
class sub |
|||
{ |
|||
public function getVal($n,$m) |
|||
{ |
|||
return $n-$m; |
|||
} |
|||
} |
|||
|
|||
class mul |
|||
{ |
|||
public function getVal($n,$m) |
|||
{ |
|||
return $n * $m; |
|||
} |
|||
} |
|||
|
|||
class div |
|||
{ |
|||
public function getVal($n,$m) |
|||
{ |
|||
return $n / $m; |
|||
} |
|||
} |
|||
|
|||
//工程类:用来创建对象
|
|||
class mathOpt{ |
|||
public static function createObj($opt){ |
|||
switch ($opt) |
|||
{ |
|||
case '+': |
|||
return new add(); |
|||
break; |
|||
case '-': |
|||
return new sub(); |
|||
break; |
|||
case '*': |
|||
return new mul(); |
|||
break; |
|||
case '/': |
|||
return new div(); |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
$obj = mathOpt::createObj('*'); |
|||
$ret=$obj -> getVal(5,7); |
|||
echo $ret; |
|||
?>
|
@ -0,0 +1,3 @@ |
|||
<?php |
|||
|
|||
?>
|
@ -0,0 +1,14 @@ |
|||
<?php |
|||
class clsA{ |
|||
public $a = 'hello'; |
|||
private $b; |
|||
public function __get($name) |
|||
{ |
|||
echo "获取{$name}失败,{$name}未定义".'<br>'; |
|||
} |
|||
} |
|||
|
|||
$obj = new clsA(); |
|||
$obj -> a = 'world'; |
|||
echo $obj -> b; //b未定义,当b被调用时,自动调用了__get,自动传入key
|
|||
?>
|
@ -0,0 +1,14 @@ |
|||
<?php |
|||
class clsA{ |
|||
public $a = 'hello'; |
|||
private $b; |
|||
public function __set($key,$val) |
|||
{ |
|||
echo "{$key}未定义, val:{$val}".'<br>'; |
|||
} |
|||
} |
|||
|
|||
$obj = new clsA(); |
|||
$obj -> a = 'world'; |
|||
$obj -> b = 'test'; //b未定义,但b被赋值时,自动调用了__set,自动传入b和test
|
|||
?>
|
@ -0,0 +1,22 @@ |
|||
<?php |
|||
//这是一个抽象类
|
|||
abstract class animal |
|||
{ |
|||
public $eyes = 2; |
|||
public $foots = 4; |
|||
abstract public function eat(); //抽象方法
|
|||
} |
|||
|
|||
class dog extends animal //继承抽象类
|
|||
{ |
|||
public function eat() //子类必须实现抽象类中的抽象方法
|
|||
{ |
|||
echo "狗吃骨头".'<br>'; |
|||
} |
|||
} |
|||
|
|||
$adog = new dog(); |
|||
$adog -> eat(); |
|||
|
|||
//注意:抽象类不能被实例化,已经要被子类继承
|
|||
?>
|
@ -0,0 +1,39 @@ |
|||
<?php |
|||
/* |
|||
* 接口是一种特殊的抽象类,所以接口时一种类 |
|||
* 一个子类可以同时继承多个接口 |
|||
* 接口里不能有变量,只有常量和抽象类 |
|||
*/ |
|||
|
|||
|
|||
//定义一个接口
|
|||
interface animal |
|||
{ |
|||
const eyes = 2; |
|||
const foots = 4; |
|||
function eat(); //抽象方法
|
|||
} |
|||
|
|||
interface pet |
|||
{ |
|||
const name = 'lucky'; |
|||
function run(); //抽象方法
|
|||
} |
|||
|
|||
class dog implements animal, pet //继承多个接口animal和pet
|
|||
{ |
|||
function eat() |
|||
{ |
|||
echo "狗吃骨头".'<br>'; |
|||
} |
|||
|
|||
function run() |
|||
{ |
|||
echo "狗跑去操场".'<br>'; |
|||
} |
|||
} |
|||
|
|||
$adog = new dog(); |
|||
$adog -> eat(); |
|||
$adog -> run(); |
|||
?>
|
@ -0,0 +1,30 @@ |
|||
<?php |
|||
|
|||
//使用 final 修饰的类,不能被继承;
|
|||
final class plant |
|||
{ |
|||
public $tall; |
|||
} |
|||
|
|||
class tree extends plant //应该会报错 Class tree may not inherit from final class (plant)
|
|||
{ |
|||
public $color; |
|||
} |
|||
|
|||
|
|||
//类中使用 final 修饰的成员方法,在子类中不能覆盖(重写)该方法。
|
|||
class animal |
|||
{ |
|||
final public function eat(){ |
|||
echo "animal eat".'<br>'; |
|||
} |
|||
} |
|||
|
|||
class dog extends animal |
|||
{ |
|||
public function eat() //应该会报错 Cannot override final method animal::eat()
|
|||
{ |
|||
echo "dog eat bone".'<br>'; |
|||
} |
|||
} |
|||
?>
|
@ -0,0 +1,15 @@ |
|||
<?php |
|||
class dog{ |
|||
public $color = 'yellow'; |
|||
public function show() |
|||
{ |
|||
echo "color=".$this->color.'<br>'; |
|||
} |
|||
} |
|||
|
|||
$adog = new dog(); |
|||
$anthorDog = clone $adog; |
|||
|
|||
$adog->show(); |
|||
$anthorDog->show(); |
|||
?>
|
@ -0,0 +1,17 @@ |
|||
<?php |
|||
class A {} |
|||
class B {} |
|||
|
|||
$obj = new A; |
|||
|
|||
$ret=$obj instanceof B; |
|||
echo $ret.'<br>'; |
|||
if($obj instanceof B){ |
|||
echo 'true'.'<br>'; |
|||
}else{ |
|||
echo 'false'.'<br>'; |
|||
} |
|||
|
|||
$ret=$obj instanceof A; |
|||
echo $ret.'<br>'; |
|||
?>
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue