Browse Source

类与对象

master
wiwkok-pc 3 years ago
parent
commit
445eeb1343
  1. 0
      01基本语法/04可变变量.php
  2. 9
      03函数/02引用.php
  3. 60
      03函数/04匿名函数.php
  4. 33
      03函数/08箭头函数.php
  5. 3
      07面向对象/05重载/__set.php
  6. 0
      07面向对象/05重载/当调用未定义的变量或方式时触发
  7. 5
      07面向对象/06抽象类abstract.php
  8. 1
      07面向对象/07接口interface.php
  9. 3
      07面向对象/09克隆clone.php
  10. 23
      07面向对象/11自动加载类/autoload.php
  11. 0
      07面向对象/11自动加载类/classA.php
  12. 3
      07面向对象/11重载.php
  13. 31
      07面向对象/13静态属性方法static.php
  14. 20
      07面向对象/14代码复用trait.php
  15. 27
      07面向对象/17遍历对象.php
  16. 40
      07面向对象/18静态绑定.php
  17. 26
      07面向对象/19对象的引用.php
  18. 13
      07面向对象/20序列化对象-在会话中存放对象/classA.php
  19. 8
      07面向对象/20序列化对象-在会话中存放对象/page1.php
  20. 8
      07面向对象/20序列化对象-在会话中存放对象/page2.php
  21. 1
      07面向对象/20序列化对象-在会话中存放对象/store
  22. 88
      07面向对象/21协变和逆变/01协变.php
  23. 32
      07面向对象/21协变和逆变/02逆变.php
  24. 20
      11自动加载类/autoload.php
  25. 6
      11自动加载类/classB.php
  26. 9
      16其他/01-php执行shell.php

01基本语法/variable_variables.php → 01基本语法/04可变变量.php

9
03函数/02引用.php

@ -0,0 +1,9 @@
<?php
function func(&$num){
$num++;
}
$a=4;
func($a);
echo $a.PHP_EOL;
?>

60
03函数/04匿名函数.php

@ -4,6 +4,7 @@
* 与普通函数一样有返回值
* 可以作为一个变量值使用
* 常用于做回调函数的参数
* 把匿名函数当成一个对象
*/
//1 匿名函数作为变量值
@ -26,22 +27,67 @@
//2 匿名函数作为函数里的函数
function func(){
$b='world';
$b='父类中的变量';
$innerFunc = function(){
//调用函数func的局部变量
echo $b; //wrong output:Undefined variable: b
//wrong output:Undefined variable: b
// $innerFunc = function(){
// //调用函数func的局部变量
// echo $b;
// };
//3 匿名函数调用父类中的变量
$innerFunc = function() use ($b){
echo "调用".$b.PHP_EOL;
};
//调用匿名函数
$innerFunc();
}
func();
// //匿名函数作为参数,回调函数
function mathOpt(function(){return 0;}){
//匿名函数作为参数,回调函数
//array_map(?callable $callback, array $array, array ...$arrays): array
//数组$array中的元素依次赋值到匿名函数中的$num
$arr=[1,2,3,4];
$ret = array_map(
function($num){
return $num * $num;
},
$arr);
print_r($ret);
//静态匿名函数
//匿名函数允许被定义为静态化。这样可以防止当前类自动绑定到它们身上,对象在运行时也可能不会被绑定到它们上面。
//不是很理解这句话
//在类中的匿名函数,不带static
class ClassA
{
public $a = 3;
function __construct()
{
$func = function(){
echo $this->a.PHP_EOL;
};
$func();
}
}
$obj=new ClassA();
//带static的匿名函数
class ClassB
{
public $a=4;
function __construct() {
$func=static function(){echo $this->a.PHP_EOL;}; //wrong output:Using $this when not in object context
$func();
}
}
$obj2=new ClassB();
?>

33
03函数/08箭头函数.php

@ -0,0 +1,33 @@
<?php
/**
* 箭头函数时匿名函数的简洁版
* fn(参数)=>表达式
*/
//匿名函数
$a = function($n){
return $n*$n;
};
echo "使用匿名函数".$a(3).PHP_EOL;
//箭头函数
$b=fn($n) => $n*$n;
echo "使用箭头函数".$b(3).PHP_EOL;
//2 箭头函数不用use,会自动继承父类的变量
$c=5;
//匿名函数
$fn1=function() use ($c){
return $c * $c;
};
echo $fn1().PHP_EOL;
//箭头函数
$fn2=fn()=>$c*$c; //这里箭头函数不用形参,就能使用父类中的$c
echo $fn2().PHP_EOL;
?>

3
07面向对象/05重载/__set.php

@ -3,8 +3,9 @@
* 重载:重新写类成员,只有当调用类中没有的成员时才会使用
*/
//__set(), 未定义或不可访问的
class clsA{
public $a = 'hello';
public $a = 'hello';
private $b;
public function __set($key,$val)
{

0
07面向对象/05重载/当调用未定义的变量或方式时触发

07面向对象/06抽象类.php → 07面向对象/06抽象类abstract.php

07面向对象/07接口.php → 07面向对象/07接口interface.php

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

@ -1,4 +1,7 @@
<?php
/**
* 克隆实质是在内存中复制多了一个独立的对象数据
*/
class dog{
public $color = 'yellow';
public function show()

23
07面向对象/11自动加载类/autoload.php

@ -0,0 +1,23 @@
<?php
/*
* 自动加载的机制是,
* 当一个类new实例化时,若在当前文件找不到这个类,包括include的文件里也找不到这个类
* 就会触发sql_autoload_register,
* sql_autoload_register里执行include_once去包含以这个与类名命名的文件
* 所以类文件的名称需要与类名相同
*/
spl_autoload_register
(
function($className)
{
include_once("./{$className}.php");
}
);
$obj = new classA(); //因为classA在autoload.php中未定义,当new时,会自动调用spl_autoload_register函数,并且传递类名
echo $obj->str.PHP_EOL;
$obj2 = new classB();
echo $obj2->str.PHP_EOL; //找不到文件./classB.php
?>

11自动加载类/classA.php → 07面向对象/11自动加载类/classA.php

3
07面向对象/11重载.php

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

31
07面向对象/13静态属性方法static.php

@ -0,0 +1,31 @@
<?php
/**
* 静态的作用是不用通过实例话,
* 直接通过区域操作符:: 访问调用
*/
class ClassA{
//静态属性
public static $varA="这是一个静态属性";
//静态方法
public static function fnA() {
echo "这个一个静态方法".PHP_EOL;
}
//对比this->和self::
public static function fnB(){
// echo $this->$varA; //this要通过对象来使用
echo self::$varA;
}
}
//访问静态属性
echo ClassA::$varA.PHP_EOL;
//访问静态方法
ClassA::fnA();
//对比this->和self::
ClassA::fnB();
?>

20
07面向对象/14代码复用trait.php

@ -0,0 +1,20 @@
<?php
/**
* 代码复用,填补了php中继承不能多继承的缺点
* 感觉就是use Cardoor 的代码等于trait Cardoor{...}的代码,有点像宏
*/
// 1 用trait定义
trait Cardoor{
public function open(){
echo "car door open".PHP_EOL;
}
}
class Car{
use Cardoor; //2 用use调用trait
}
$myCar = new Car();
$myCar->open();
?>

27
07面向对象/17遍历对象.php

@ -0,0 +1,27 @@
<?php
/**
* 使用foreach遍历可访问的属性(变量)
*/
class ClassA{
public $varA="varA";
protected $varB="varB";
private $varC="varC";
public function fnA(){
echo "fnA".PHP_EOL;
}
protected function fnB(){
echo "fnB".PHP_EOL;
}
private function fnC(){
echo "fnC".PHP_EOL;
}
}
$obj=new ClassA();
foreach($obj as $key => $value){
echo "$key:$value".PHP_EOL;
}
?>

40
07面向对象/18静态绑定.php

@ -0,0 +1,40 @@
<?php
//静态绑定前
class ClassA{
public function fnA(){
echo __CLASS__.PHP_EOL;
}
public function fnB(){
self::fnA(); //调用的是ClassA中的fnA
}
}
class ClassB extends ClassA
{
public function fnA(){
echo __CLASS__.PHP_EOL;
}
}
ClassB::fnB();
//后期静态绑定
class ClassC{
public function fnA(){
echo __CLASS__.PHP_EOL;
}
public function fnB(){
static::fnA(); //继承之后static代表的是ClassB
}
}
class ClassD extends ClassC{
public function fnA(){
echo __CLASS__.PHP_EOL;
}
}
ClassD::fnB();
?>

26
07面向对象/19对象的引用.php

@ -0,0 +1,26 @@
<?php
/**
* 也就是说php中对象赋值,其实是引用
*/
class ClassA{
public $var=1;
}
$a=new ClassA;
$b=$a; //赋值后,$a,$b只是标识符不一样,其实指向了同样的内容
$b->var=2;
echo $a->var.PHP_EOL;
$c=new ClassA;
$d=&$c; //引用
$d->var=2;
echo $c->var.PHP_EOL;
$e=new ClassA;
function func($obj){
$obj->var=2;
}
func($e);
echo $e->var;
?>

13
07面向对象/20序列化对象-在会话中存放对象/classA.php

@ -0,0 +1,13 @@
<?php
/**
* 就是把类的信息转成字符串存在一个文件里,等需要时转回来
*/
class ClassA{
public $varA=1;
public function funcA(){
echo $this->varA;
}
}
?>

8
07面向对象/20序列化对象-在会话中存放对象/page1.php

@ -0,0 +1,8 @@
<?php
include("classA.php");
$objA=new ClassA;
$strA=serialize($objA);
echo $strA.PHP_EOL;
file_put_contents("store",$strA);
?>

8
07面向对象/20序列化对象-在会话中存放对象/page2.php

@ -0,0 +1,8 @@
<?php
include("classA.php");
$strA = file_get_contents("store");
$objA = unserialize($strA);
$objA->funA();
?>

1
07面向对象/20序列化对象-在会话中存放对象/store

@ -0,0 +1 @@
O:6:"ClassA":1:{s:4:"varA";i:1;}

88
07面向对象/21协变和逆变/01协变.php

@ -0,0 +1,88 @@
<?php
/**
* 还不能掌握什么是协变
* 创建了一个animal的抽象类,留了speak叫这个动作给子类具体化
* 创建一个dog类,继承了animal类,并且具体化了叫这个类,狗会吠,猫会喵
*/
abstract class Animal{
protected string $name;
public function __construct(string $name){
$this->name=$name;
}
abstract public function speak();
}
class Dog extends Animal{
public function speak(){
echo $this -> name." barks".PHP_EOL;
}
}
class Cat extends Animal{
public function speak(){
echo $this->name." meows".PHP_EOL;
}
}
$doggy=new Dog("旺财");
$doggy->speak();
interface AnimalShelter{
public function adopt(string $name):Animal;
}
class CatShelter implements AnimalShelter{
public function adopt(string $name):Cat{
return new Cat($name);
}
}
class DogShelter implements AnimalShelter{
public function adopt(string $name):Dog{
return new Dog($name);
}
}
$kitty=(new CatShelter)->adopt("ricky");
$kitty->speak();
$doggy=(new DogShelter)->adopt("lucky");
$doggy->speak();
class Food{}
class AnimalFood extends Food{}
abstract class Animal{
protected string $name;
public function __construct(string $name){
$this->name=$name;
}
public function eat(AnimalFood $food){
echo $this->name."eats".get_class($food);
}
}
class Dog extends Animal{
public function eat(Food $food){
echo $this->name."eats".get_class($food);
}
}
$kitty=(new CatShelter)->adopt("ricky");
$catFood=new AnimalFood();
$kitty->eat($catFood).PHP_EOL;
$doggy=(new DogShelter)->adopt("lucky");
$banana=new Food();
$doggy->eat($banana);
?>

32
07面向对象/21协变和逆变/02逆变.php

@ -0,0 +1,32 @@
<?php
//逆变
class Food{}
class AnimalFood extends Food{}
abstract class Animal{
protected string $name;
public function __construct(string $name){
$this->name=$name;
}
public function eat(AnimalFood $food){
echo $this->name."eats".get_class($food);
}
}
class Dog extends Animal{
public function eat(Food $food){
echo $this->name."eats".get_class($food);
}
}
$kitty=(new CatShelter)->adopt("ricky");
$catFood=new AnimalFood();
$kitty->eat($catFood).PHP_EOL;
$doggy=(new DogShelter)->adopt("lucky");
$banana=new Food();
$doggy->eat($banana);
?>

20
11自动加载类/autoload.php

@ -1,20 +0,0 @@
<?php
/*
* new时,若类未定义,回去别的文件找这个类
* 类文件的名称需要与类名相同
*/
spl_autoload_register
(
function($className)
{
include_once("./{$className}.php");
}
);
$obj = new classA(); //因为classA在autoload.php中未定义,当new时,会自动调用spl_autoload_register函数,并且传递类名
echo $obj->str.'<br>';
$obj2 = new classB();
echo $obj2->str.'<br>';
?>

6
11自动加载类/classB.php

@ -1,6 +0,0 @@
<?php
class classB
{
public $str = 'world';
}
?>

9
16其他/01-php执行shell.php

@ -0,0 +1,9 @@
<?php
/**
* /usr/local/php/etc/php.ini中
* disable_functions=shell_exec去掉
*/
$output = `ls -l`;
echo $output.PHP_EOL;
?>
Loading…
Cancel
Save