Browse Source

类与对象

master
kuangweijian 3 years ago
parent
commit
58bc67e6ce
  1. 20
      07面向对象/01.php
  2. 96
      07面向对象/01继承.php
  3. 6
      07面向对象/02命名空间/01显示当前的命名空间.php
  4. 18
      07面向对象/02命名空间/02使用命名空间/file1.php
  5. 33
      07面向对象/02命名空间/02使用命名空间/file2.php
  6. 54
      07面向对象/02命名空间/03use的使用/demo.php
  7. 18
      07面向对象/02命名空间/03use的使用/file.php
  8. 59
      07面向对象/03工场模式--创建对象的类.php
  9. 3
      07面向对象/04单例模式.php
  10. 14
      07面向对象/05魔术方法/__get.php
  11. 14
      07面向对象/05魔术方法/set.php
  12. 22
      07面向对象/06抽象类.php
  13. 39
      07面向对象/07接口.php
  14. 30
      07面向对象/08最终类final.php
  15. 15
      07面向对象/09克隆clone.php
  16. 17
      07面向对象/10判断对象是否属于某个类.php

20
07面向对象/01.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{
}
}
?>

96
07面向对象/01继承.php

@ -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();
?>

6
07面向对象/02命名空间/01显示当前的命名空间.php

@ -0,0 +1,6 @@
<?php
namespace foo\bar\demo;
echo '命名空间为'.__NAMESPACE__;
?>

18
07面向对象/02命名空间/02使用命名空间/file1.php

@ -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>';
}
}
?>

33
07面向对象/02命名空间/02使用命名空间/file2.php

@ -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
?>

54
07面向对象/02命名空间/03use的使用/demo.php

@ -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'
?>

18
07面向对象/02命名空间/03use的使用/file.php

@ -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';
}
}
?>

59
07面向对象/03工场模式--创建对象的类.php

@ -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;
?>

3
07面向对象/04单例模式.php

@ -0,0 +1,3 @@
<?php
?>

14
07面向对象/05魔术方法/__get.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
?>

14
07面向对象/05魔术方法/set.php

@ -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
?>

22
07面向对象/06抽象类.php

@ -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();
//注意:抽象类不能被实例化,已经要被子类继承
?>

39
07面向对象/07接口.php

@ -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();
?>

30
07面向对象/08最终类final.php

@ -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>';
}
}
?>

15
07面向对象/09克隆clone.php

@ -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();
?>

17
07面向对象/10判断对象是否属于某个类.php

@ -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>';
?>
Loading…
Cancel
Save