吾爱乐享
个人学习网站

php学习之类与对象的三大特征-封装

吾爱乐享阅读(2589)

1.基本介绍

oop的三大特征:封装、继承、多态

封装就是把抽象出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只能通过被授权才能对数据进行操作。

1.1 封装的具体实现-访问修饰符

访问修饰符包括public、protected、private,分别是公开的、受保护的、私有的,访问修饰符对常用属性和成员方法都适用

优先级:public>protected>private

  • public :在类的内部、外部、子类都可以访问
  • protected:只能在本类和子类中使用
  • private:只能在本类中使用

案例说明:

<?php
//访问修饰符案例
class Person{
public $name;
protected $age;
private $sex;

public function __construct($name,$age,$sex){
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
//三种不同的访问修饰符
public function getName(){
echo '<br> name = '.$this->name;

}
protected function getAge(){
echo '<br> age = '.$this->age;

}
private function getSex(){
echo '<br> sex = '.$this->sex;

}
public function show(){
echo '<br> 属性age = '. $this->age;
echo '<br> 属性sex = '. $this->sex;
echo $this->getAge();
echo $this->getSex();
}

}
$p1=new Person('张三',23 ,'男');
//public修饰的属性和方法可以在任何地方使用
echo'<br> name = '. $p1->name;
echo '<br>'. $p1->getName();
//不能被调用,受保护的方法不能在类的外部使用
//echo '<br> age = '. $p1->age;
//echo '<br> sex = '. $p1->sex;
//不能被调用,私有的的方法不能在类的外部使用
//echo '<br> age = '. $p1->getAge();
//echo '<br> sex = '. $p1->getSex();
//要想调用 在本类中定义一个public的方法,把protected和private修饰的属性和方法在一个公开的方法中调用
echo $p1->show();
?>

1.2 如何访问protected和private属性的三种形式

  • 使用魔术方法__get和__set来实现对protected和private属性的操作
    <?php
    //访问修饰符案例
    class Person{
    public $name;
    protected $age;
    private $sex;
    
    public function __construct($name,$age,$sex){
    $this->name = $name;
    $this->age = $age;
    $this->sex = $sex;
    }
    //使用__set方法修改属性
    public function __set($pro_name,$pro_val){
    //判断当前对象是否存在传入的变量
    if(property_exists($this,$pro_name)){
    $this->$pro_name = $pro_val;
    }else{
    echo '<br>当前属性名不存在!!!';
    }
    }
    //使用__get方法获取属性
    public function __get($pro_name){
    if(property_exists($pro_name)){
    return $this->$pro_name;
    }else{
    echo '<br>当前属性名不存在!!!';
    }
    
    }
    
    }
    $p1=new Person('张三',23 ,'男');
    //修改被protected和private修饰的属性
    echo '<br>' .$p1->age=24;
    echo '<br>' .$p1->sex='女';
    
    ?>

优缺点:

  1. 优点:简单,一对__set和__get就可以搞定所有的private和protected修饰的属性
  2. 缺点:不够灵活,没有办法对各个属性进行控制和验证
  • 对每个private和protected属性都提供一对get和set方法,这个就可以对每个属性进行单独的验证和控制
    <?php
    //访问修饰符案例
    class Person{
    public $name;
    protected $age;
    private $sex;
    
    public function __construct($name,$age,$sex){
    $this->name = $name;
    $this->age = $age;
    $this->sex = $sex;
    }
    //使用setXxx方法验证修改age属性
    public function setAge($age){
    //判断传入的值是不是数字且要大于0
    if(is_numeric($age) && $age > 0 ){
    $this->age= $age;
    }else{
    echo '<br>当前属性值格式不正确!!!';
    }
    }
    //使用getXxx方法获取age属性
    public function getAge(){
    return $this->age;
    
    }
    //使用setXxx方法验证修改sex属性
    public function setSex($sex){
    //判断传入的值是不是数字且要大于0
    if($sex=='男'|| $sex == '女' ){
    $this->sex= $sex;
    }else{
    echo '<br>当前属性值格式不正确!!!';
    }
    }
    //使用getXxx方法获取sex属性
    public function getSex(){
    return $this->sex;
    }
    }
    $p1=new Person('张三',23 ,'男');
    //修改被protected和private修饰的属性
    $p1->setAge(24);
    echo '<br>' .$p1->getAge();
    $p1->setSex('女');
    echo '<br>' .$p1->getSex();
    ?>

优缺点:

  1. 优点:可以对每个属性进行验证,很灵活
  2. 缺点:会造成比较多的setXxx和getXxx方法,但这个也没什么大的问题
  3. 推荐使用这样的方法
  • 写一个成员方法,可以根据业务逻辑,一次性对多个属性批量操作
    <?php
    //访问修饰符案例
    class Person{
    public $name;
    protected $age;
    private $sex;
    
    public function __construct($name,$age,$sex){
    $this->name = $name;
    $this->age = $age;
    $this->sex = $sex;
    }
    //使用setXxx方法验证修改age属性
    public function setAge($age){
    //判断传入的值是不是数字且要大于0
    if(is_numeric($age) && $age > 0 ){
    $this->age= $age;
    }else{
    echo '<br>当前属性值格式不正确!!!';
    }
    }
    //使用getXxx方法获取age属性
    public function getAge(){
    return $this->age;
    
    }
    //使用setXxx方法验证修改sex属性
    public function setSex($sex){
    //判断传入的值是不是数字且要大于0
    if($sex=='男'|| $sex == '女' ){
    $this->sex= $sex;
    }else{
    echo '<br>当前属性值格式不正确!!!';
    }
    }
    //使用getXxx方法获取sex属性
    public function getSex(){
    return $this->sex;
    
    }
    //创建一个成员方法,获取修改信息
    public function undate($age,$sex){
    $this->setAge($age);
    $this->setSex($sex);
    }
    //创建一个展示用户信息的方法
    public function show(){
    echo '年龄是 ' .$this->age;
    echo '性别是 ' .$this->sex;
    }
    }
    $p1=new Person('张三',23 ,'男');
    //修改被protected和private修饰的属性
    
    $p1->undate(24,'女');
    $p1->show();
    
    
    
    ?>

1.3 在开发中如何选择操作方式

  1. 如果我们希望直接通过$对象名->属性名的方式来操作属性,则使用__get和__set函数即可
  2. 如果我们希望使用各个属性分别进行验证则使用setXxx和getXxx
  3. 如果我们希望同时操作多个属性则选择第三种

1.4 封装的细节说明

  1. 普通属性要定义为public 、protected和private之一,如果var定义,则被视为公有,静态属性可以不指定访问修饰符,默认为public
  2. 类中的方法可以被定义为公有、私有、受保护的,如果没有定义默认是public

1.5 对象运算符连用

案例:通过一个学生对象,可以访问到该学生所在班级的信息.

<?php

//通过一个学生对象,可以访问到该学生所在班级的信息.
//定义一个学生类
class Student{
public $name;
private $school;
public function __construct($name,$school){
$this->name = $name;
$this->school = $school;
}
public function getSchool(){
return $this->school;
}
public function setSchool($school){
$this->school=$school;
}

}
//定义一个学校类
class School{
public $name;
public $address;
private $my_class;
public function __construct($name,$address,$my_class){
$this->name = $name;
$this->address = $address;
$this->my_class = $my_class;
}
public function getMyClass(){
return $this->my_class;
}
public function setMyClass($my_class){
$this->my_class=$my_class;
}

}
//定义一个班级类
class Myclass{
protected $name;
protected $stu_num;
private $introduce;
public function __construct($name,$stu_num,$introduce){
$this->name = $name;
$this->stu_num = $stu_num;
$this->introduce = $introduce;
}
public function getIntroduce(){
return $this->introduce;
}
public function setIntroduce($introduce){
$this->introduce=$introduce;
}
}
//首先创建班级对象
$myClass = new Myclass('1107' , 2, '学习的班级');
//创建学校对象
$school = new School('我的学校' , '陕西',$myClass);
//创建学生对象
$student = new Student('张三', $school);
var_dump($student->getSchool()->getMyClass()->getIntroduce());

?>

html内嵌php代码无法解析

吾爱乐享阅读(2010)

php, apache都安装完成,但是这样的代码,浏览器无法解析其的php代码.

<html><body><h1>d</h1>
<?php
echo “test”;
?>
</body></html>

问题解决:

在httpd.conf中加入以下二条, 重启.OK!

AddHandler php5-script .php .html

AddType text/html .php .html

php学习之类与对象的类的静态方法

吾爱乐享阅读(1947)

基本介绍

当程序员需要对静态属性进行操作时,就需要定义静态方法处理,静态方法是专门操作静态属性的

基本语法

class 类名{

访问修饰符 static function 函数名 (){

//函数体

}

}

说明:

  1. 静态方法是在类中定义的
  2. static是关键词
  3. 静态方法是专门用于操作静态属性
  4. 静态方法可以直接用类名调用,形式是:类名::静态方法名(参数)

小案例:

<?php

//静态方法
class Person{
public $name;
private static $age=18;
//静态方法来操作静态属性
public static function getAge(){
echo '年龄是 '.self::$age;
}
}
//通过类名在外部直接调用静态方法
Person::getAge();
?>

静态方法注意事项

  • 在类的外部调用静态方法:类名::静态方法名,或者对象名->静态方法名或者对象名::静态方法名,后面两种不推荐使用
  • 在类的内部调用静态方法:self::静态方法名  或者类名::静态方法名,通过$this也可以
  • 静态方法中只能访问静态属性, 不能访问非静态属性
  • 普通成员方法,既可以访问非静态属性也可以访问静态属性
  • 如果静态方法被protected或private修饰,也不能在类的外部使用

案例:

<?php

//静态方法
class Person{
public $name;
private static $age=18;

//构造方法
public function __construct($name){
$this->name=$name;
}
//静态方法来操作静态属性
public static function getAge(){
echo '年龄是 '.self::$age;
//静态方法中只能访问静态属性,不能访问非静态属性
//echo $this->name.'的年龄是 '. self::$age;//这样写是错误的 不能访问非静态属性
//echo self::$name.'的年龄是 '. self::$age;//这样写也是错误的 不能访问非静态属性
}
//在类的内部调用静态方法
public function show(){
//方法一:self::方法名
self::getAge();
//方法二:类名::方法名
Person::getAge();
//方法三:$this->方法名
$this->getAge();
}
}


//通过类名在外部直接调用静态方法
Person::getAge();
//在类的外部通过对象调用静态方法
$person = new Person('张三');
$person->getAge();
//在类的外部通过对象名::静态方法调用
$person::getAge();

$person->show();
?>

静态属性和静态方法实战: 单例模式

编写一个操作数据库的工具类,要求只能创建一个对象

<?php
//编写一个操作数据库的工具类,要求只能创建一个对象

class DaoMysql{
//定义需要的属性
//连接数据库
private $mysql_link;
//定义一个静态属性,用来类的对象实例
private static $instance = null;
//构造方法
public function __construct($host,$user,$pass){
//这里只连接一次数据库,减少资源

$this->mysql_link = @mysql_connect($host,$user,$pass);
echo $this->mysql_link;
}
//写一个静态方法,通过这个静态方法来创建对象实例
public static function getSingleton($host,$user,$pass){
//通过getSingleton来创建对象
//判断控制是否已经创建过对象
if(self::$instance == null){
self::$instance = new DaoMysql($host,$user,$pass);
}
return self::$instance;
}
//阻止克隆
private function __clone(){}
}

$dao1 = DaoMysql::getSingleton('localhost','root','');
$dao2 = DaoMysql::getSingleton('localhost','root','root');
var_dump($dao1,$dao2);//结果都是同一个对象

?>

另一种写法(推荐)

instance是类型运算符,它用于判断某个变量是否是某个类的对象

<?php
//编写一个操作数据库的工具类,要求只能创建一个对象

class DaoMysql{
//定义需要的属性
//连接数据库
private $mysql_link;
//定义一个静态属性,用来类的对象实例
private static $instance = null;
//构造方法
public function __construct($host,$user,$pass){
//这里只连接一次数据库,减少资源

$this->mysql_link = @mysql_connect($host,$user,$pass);
echo $this->mysql_link;
}
//写一个静态方法,通过这个静态方法来创建对象实例
public static function getSingleton($host,$user,$pass){
//通过getSingleton来创建对象
//判断控制是否已经创建过对象
/* //第一种写法
if(self::$instance == null){
self::$instance = new DaoMysql($host,$user,$pass);
}
return self::$instance;
} */
//第二种写法
//instanceof是类型运算符,它用于判断某个变量是否是某个类的对象
if(!self::$instance instanceof self){
self::$instance = new self($host,$user,$pass);
}
return self::$instance;
}
//阻止克隆
private function __clone(){}
}

$dao1 = DaoMysql::getSingleton('localhost','root','');
$dao2 = DaoMysql::getSingleton('localhost','root','root');
var_dump($dao1,$dao2);//结果都是同一个对象

?>

php学习之类与对象的类的静态属性

吾爱乐享阅读(2738)

静态变量定义

静态变量是当前类的所有对象共享的变量,任何一个该类的对象去访问它时,取得的都是相同的值,同样任何一个该类的对象去修改它时,也时同样被修改

定义静态变量

  • 访问修饰符 static 静态属性名;
  • static 访问修饰符 静态属性名;

两种方式都可以

访问静态变量

  • 在类的内部访问:有两种方式

    1. self::静态属性名;
    2. 类名::$静态属性名;

  • 在类的外部访问

如果是在类的外部访问今天属性,静态属性需要是public,否则也不能直接访问,访问的形式是   类名::$属性名

$thishe self 的区别

  1. 使用方式不同
    1. self::
    2. $this->
  2. self是类的范畴指向类,$this是对象实例,指向对象实例

静态变量的使用注意事项

  1. 如果在类的内部去使用静态变量,有两种形式,self::$静态变量,   类名::$静态变量, 静态属性可以是public、protected、private
  2. 在类的外部访问静态属性时 只能是类名::$静态属性名,要求是public
  3. 静态变量可以在定义时,直接初始化,普通的成员属性也可以

需求:

玩游戏时,当有人加入游戏时加一,最后统计有多少人加入游戏

优化前

<?php 
//玩游戏时,当有人加入游戏时加一,最后统计有多少人加入游戏
class Game{
public $name ;
public $num = 0;
public function __construct($name){

$this->name = $name;
}

public function playGame(){
echo $this->name.'<br> 加入游戏';
global $num ;
$num++;
}

}
$play1 = new Game('张三');
$play2 = new Game('李四');
$play3 = new Game('王五');
$play4 = new Game('赵六');

$play1->playGame();
$play2->playGame();
$play3->playGame();
$play4->playGame();
echo '总共有' . $num .'个人加入游戏';

?>

对代码进行优化!

静态变量:静态变量是属于所有对象,因此可以被所有的对象共享‘

<?php 
//玩游戏时,当有人加入游戏时加一,最后统计有多少人加入游戏
class Game{
public $name ;
public static $num = 0;
public function __construct($name){

$this->name = $name;
}

public function playGame(){
echo $this->name.'<br> 加入游戏';
//在类中调用静态变量的方法是self::变量名
self::$num++ ;
}
//定义个统计方法
public function count1(){
echo '总共有' . self::$num .'个人加入游戏';
}
}
$play1 = new Game('张三');
$play2 = new Game('李四');
$play3 = new Game('王五');
$play4 = new Game('赵六');

$play1->playGame();
$play2->playGame();
$play3->playGame();
$play4->playGame();
$play4->playGame();

$play4->count1();?>

静态方法内存图

 

php学习之类与对象的类的自动加载的使用

吾爱乐享阅读(1987)

当我们在一个文件中使用多个类,就会用到类的自动加载,在开发中,一个类对应一个文件,命名方式为类名.class.php,通过include或require引入

当使用一个未定义的类时,就会自动触发__autoload函数

案例:

有三个php文件,其中一个是Show.php展示文件,还有两个是类文件,Dog.class.php和Cat.class.php

1.传统方式解决

2.对代码优化,使用类的自动加载

3.对代码进一步优化,更灵活

创建一个common.php文件,把类名和路径的映射关系数组定义好

<?php
//传统的做法就是引入文件,这样不利于维护
// require './Dog.class.php';
// require './Cat.class.php';
//类的自动加载完成
/*
@function 完成类的自动加载
@param $class_name 是类的名称
@说明:当使用一个未定义的类时,就会自动触发__autoload函数
*/
// function __autoload($class_name){
// require './'.$class_name.'.class.php';

// }

//不同的文件夹下的类,进行自动加载
require './common.php';
function __autoload($class_name){
global $array;//把全局变量局部化
require $array[$class_name];
var_dump($array);

}

$dog = new Dog('哮天犬',23);
$dog->show();
echo '<br>';

$cat = new Cat('叮当猫',11);
$cat->show();

?>

4.使用spl_autoload_register 高级方式完成类的自动加载

spl_autoload_register可以灵活的注册自己的自动加载函数,就是可以自定义自动加载函数

案例:

php学习之类与对象的构造方法使用技巧

吾爱乐享阅读(2223)

成员方法

在一个类中,当我们需要对象完成一个人任务时,就需要在类中定义一个函数,这个函数就称为成员方法

案例:

1.添加成员方法,打印一个字符串

2.添加sum求和的成员方法,计算1-100的和

3.添加num成员方法,计算变量的2倍的值

4.添加getMax成员方法,计算最大值

成员方法的基本语法

class 类名{

成员属性;

访问修饰符 function 成员方法(形参){

方法体

return;

}

说明:

  1. 成员方法定义在类中
  2. 成员方法前面可以有访问修饰符,不写默认是public
  3. 成员方法的运行原理和普通的函数是一样的

成员方法说明:

  1. 方法的形参可以是多个,适合所有的类型
  2. 方法可以没有return,默认返回的时null
  3. 成员方法不可以直接调用,而是通过对象实例化调用的

构造方法

就是给成员属性进行初始化

构造方法基本语法:

class 类名{

访问修饰符 function __construct(形参){

对成员属性初始化

}

}

说明:

  1. 构造方法的访问修饰符可以是public、protected、private,一般情况是public,默认是public
  2. __construct是关键词,不能修改。前面是两个下划线_
  3. 构造方法没有返回值,即没有return
  4. 构造方法是系统调用的,程序员不能显示调用

案例:

构造方法的细节和注意事项:

  • 构造方法没有返回值,就算写了没有任何意义
  • 在创建一个类的新对象时,系统会自动的调用该类的构造方法对新的对象进行初始化
  • 构造方法的作用就是对成员属性进行初始化,而不是创建对象本身
  • 在一个类中,构造方法有且只有一个,定义多个会报错
  • 在php4中可以使用类名作为构造方法,在php5也支持

默认构成方法:

在类中,如果没有定义构造方法,那么系统会默认有一个构造方法

注意:

  1. 一旦自定义了一个构造方法,默认的构造方法就会被覆盖,这时创建对象的时候就会使用自定义的构造方法
  2. 一个类只能有一个构造方法

this只能在类的方法中使用,而不能在类的外部使用

构造方法小结:

  1. 构造方法的名和类名相同也可以使用关键词__construct
  2. 构造方法没有返回值
  3. 作用是对新对象进行初始化
  4. 一个类有且只有一个构造方法
  5. 如果没有给类自定义构造方法,该类使用系统默认的构造方法
  6. 如果给类定义了构造方法,该类的默认构造方法被覆盖
  7. 构造方法默认使用的修饰符是public

析构方法:

在php5中引入了析构函数,类似于面向对象语言,析构函数会在某个对象的所有引用都被删除或当对象被显式销毁时执行

分析:

  1. 在php中引入的一个技术
  2. 某个对象的所有引用都被删除
    1. 使用unset(对象名),将对象名销毁
    2. $对象名 = null。对象名赋值null
    3. $对象名 = ‘abc’;对象名赋值字符串,对象名就变成普通变量
  3. 显式销毁,上面三种销毁都是显式销毁,就是程序员主动的删除对象引用,如果程序员不去主动销毁对象,那么在程序执行完毕后,这个对象就会被系统销毁,这就是系统销毁机制

php文件执行流程:

析构函数基本使用:

基本语法:

class 类名{

public function __destruct(){

函数体

}

}

说明:

  1. 析构函数都是public修饰符
  2. __destruct关键词,不能修改
  3. 析构函数没有形参
  4. 析构函数是系统调用的
  5. 析构函数在以下情况会被调用
    1. php文件执行完毕
    2. 某个对象的所有引用都被删除后,就会马上调用析构函数

作用:

析构函数的作用就是释放对象创建的资源,如:数据库连接,文件句柄,绘图句柄等

析构函数小结:

  1. 当没有变量指向某个对象时,这个对象就会被销毁
  2. 在销毁对象前,析构函数会被调用的
  3. 析构函数不是销毁对象本身,而是在销毁对象前给程序员一次机会,可以让程序员去及时的回收该对象创建的资源,比如数据库连接

析构函数最佳实战:

使用析构函数完成对资源的及时释放

说明:

  1. 关于在析构函数中释放资源的问题,如果我们对效率没有很高的特殊要求,完全可以不使用析构函数
  2. 如果我们不确定嗲吗后面是否还会使用资源(比如链接),那我们建议最好不要使用析构函数
  3. 项目有特殊和明确的要求时,我们可以使用析构函数,显式销毁对象时,在析构函数中释放资源

垃圾回收机制

  1. 在php中,当一个对象没有任何引用指向它的时候,就会成为一个垃圾对象,php将启用垃圾回收器将对象销毁
  2. 当程序退出前,php也将启用垃圾回收器,销毁对象

php垃圾回收机制是php5之后才有的,php5.3之前使用的垃圾回收机制是单纯的引用计数,也就是每个内存对象都分配一个计数器,,当内存对象被变量引用时,计数器+1 ,当变量引用撤掉时,计数器-1,当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成

php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一个复杂的算法,来检测内存对象中引用环的存在,以避免内存泄漏

php学习之类与对象基础知识,适合初学者

吾爱乐享阅读(2010)

小案例-快速入门

//打印张三对应的年龄和性别

  •  最初的解决方法:

定义三个变量,一一打印输出

  • 数组的解决方式:

    更进一步,只定义一个变量,减少内存

    $arr= array(‘name’=>’张三’, ‘age’=>23, ‘sex’=>’男’);

  • 用面向对象方式解决:

分析:

  1. class 是一个关键词,表示这个是一个类,固定形式

  2. ZhangSan 这是一个定义的类名,自定义的,要符合类的规范

  3. public $name 是一个成员属性,定义在类中的变量就称为成员属性

  4. public 是访问修饰符,是用来控制成员属性的访问范围,除了public还有protected和private

  5. $zhangsan = new ZhangSan();  这是实例化对象,$zhangsan 就是一个对象,new是个关键词,表示新创建的一个对象

  6. $zhangsan->name=’张三’ 表示给一个成员属性赋值,->这是对象运算符

  7. 查看对象情况可以用var_dump()函数,获取具体的对象中的某个值,echo $zhangsan->name;

 类与对象的关系

  • 介绍

在面向对象中,最重要的概念就是类和对象,比如,一个人类,每一个人都具有一定的属性和行为方法,这这些属性和方法具体到每一个人身上就是一个对象,一个大类就是有无数个对象组成

定义一个人类:

说明:

  1. 一个类可以创建多个对象

  2. 不同的对象的后面的编号不一样,是系统自动分配的

  3. 类的命名规范:驼峰命名比如$ZhangSan

理解类如对象

  1. 类是抽象的,代表的是一类事物,比如人类、猫类、动物类

  2. 对象是具体的,实际存在的,是一个具体的事物,比如具体的一个人,一只猫、一只狗

  3. 类可以看作是一个模板,对象则是类的一个具体的实例

类的定义

class 类名{

访问修饰符 成员属性1;

访问修饰符 成员属性2;

…….

}

成员属性

定义:类的变量成员叫做属性,或者叫做字段、特征,在本文挡中称为属性, 属性声明是由关键词public、protected、private开头。然后跟一个普通的变量声明组成,属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段时就可以得到其值,而不依赖于运行时的信息才能求值

简言之:就是类的一种属性,属性的值符合全部的数据类型(8种数据类型)

  • 对象创建

对象创建有两种方式,一个是类名后面加括号,另一个就是不加

  1. $对象名 = new 类名();

  2. $对象名 = new 类名;

  • 对象访问

$对象名->属性名;

->对象运算符

说明:

  1. 在使用默认构造方法时,创建对象的

    new 类名()和new类名是等价的

对象传递方式

第一种传递方式:$p2 = $p1;

说明:

  1. 所有的代码必须加载到内存才能被执行
  2. 当把一个对象赋给另一个变量时,也是值的拷贝。。指向的是同一个标识符

第二种传递方式:$p2 = &$p1;

php学习之数组的相关知识-冒泡排序

吾爱乐享阅读(1870)

说明:

排序就是对某组数据进行升序或降序的方式排列,排序都是针对的索引数组

排序就是将一组数据按照指定的顺序进行排列的过程

排序的分类:

  1. 内部排序:指将需要处理的数据都加载到内部存储器中进行排序,包括交换式排序,选择试排序和插入式排序

  2. 外部排序:数据量过大,无法全部加载到内存,需要借助外部存储进行排序,包括合并排序和直接合并排序法

冒泡排序

基本思想:通过对待排序序列从后到前(从下标较大的元素开始)一次比较相邻元素的排序码明若发现逆序则交换,使排序较小的元素逐渐从后向前移动,就像水底气泡一样逐渐向上冒

因为排序的过程中,各元素不断接近自己的位置,如果一躺比较下来没有进行过交换没救说明序列有序,因此要在排序过程汇总设置一个标志判断元素是否进行过交换,从而减少不必要的比较

从小到大排序或从大到小排序

找到从最大的下标的值和前面的值进行比较,如果前面小于后面的值,进行位置交换,以此类推,一直找到当前最大值,一次完成,继续找第二大下标的值进行比较,和它前面的值交换位置,以此类推最终排序完成

如:$arr = array(11,22,44,67,95,33,43)从小到大排序:11,22,33,43,44,67,95

冒泡原理:

  1. 从小到大排序,确定数组的长度

  2. 循环遍历找出每个值

  3. 每一个值和它下一个值进行比较,本身不比较,每次比较取出一个最小值

  4. 进行大小值交换

  5. 排序

选择排序

说明:从数组中选择一个数和其他进行比较,如果大于比较的数,交换位置

选择一个我们自己想象的一个数组为最大或最小

基本思想:

第一次从arr[0]-arr[n-1]中选取最小值,与arr[0]交换,

第二次从arr[1]-arr[n-1]中选取最小值,与arr[1]交换,

第三次从arr[2]-arr[n-1]中选取最小值,与arr[2]交换,

……

比如:$arr = array(11,55,22,44,99,77,66,33,88);从小到大排序

选择一个自己想象的最小值,一般选arr[0]的值,和后面的比较,如果大于后面的数组,这两个位置交换

php学习之数组的相关知识-二维数组的相关知识

吾爱乐享阅读(1789)

1.定义

在弱类型语言中是没有具体的一个创建多维数组的函数或者变量的,通过一维数组的创建方式来组合成二维数组或者多维数组

创建方式:一个数组的元素是另一个数组,这个时候称为二维数组,如果一直往下的元素还是数组,这个时候就是多维数组

创建方式一:

创建方式二:

创建方式三:

多维数组创建

多维数组的使用

1.获取一个值的方式:
变量[第一维下标][第二维的下标][….]
2.循环遍历:

php学习之数组的相关知识-数组的遍历

吾爱乐享阅读(1984)

1.基本使用

1.1获取到一个元素的值:数组变量名[下标];

必须知道下标是说明,只能打印一个值

1.2数组的遍历

遍历就是一个一个的自动获取数组中的每个值

1.2.1 for循环遍历数组-只能遍历索引数组

使用过程:

  1. 获取数组的长度:count();
  2. 获取数组的下标:count() -1;
  3. 循环遍历

如果不是索引数组,则会报错:Notice: Undefined offset: 3 in F:\wamp\www\array\shiyong.php on line 16

案例:

1.2.2 foreach循环遍历数组-遍历关联和索引

基本语法:

foreach(数组变量名 as $key => $value){

$key就是每次循环获取数组中的一个元素的下标,自定义的变量名而已

$value 就是每次循环获取数组中的每个元素的值,也是自定义的变量

}

循环每次获取一个值,获取完之后,数组内部的指针下移,一直到数组的值获取结束,给false

案例:

1.2.3 while+each+list循环遍历数组-都可以遍历

while循环如果有内容就认为是真,如果没有内容就认为是假

each()函数:

获取数组中的一个元素,再把获取到的元素赋值给一个新的变量,这时候的变量就是就存储了元素种的键名和键值,组成一个新的数组,获取完之后,数组指针下移,获取下一个元素

组成新的数组:当前数组的下标和值都是新的数组中的值,下标是系统默认生成的两对(关联和索引)索引为0和1,关联是key和value。0和key获取的说是原来数组的下标,1和value获取的时原来数组的值

list()函数:

把数组中的值取出来给list中的变量,也就是说list中放的变量就可以获取数组的值;list()函数只能获取索引数组中的内容

list(变量1,变量2,变量3,….)=数组变量名;

循环遍历:

2.常用的几个数组函数

2.1 count():获取数组的长度

2.2 is_array():检查某个变量是不是数组

2.3 var_dump():打印输出数组中类型和长度和值

2.4 print_r():打印输出数组中的键值对

2.5 implode():通过一个分隔符连接数组成为字符串

2.6 explode():通过一个分隔符把一个字符串分割成数组

案例:传入多选框用接收方式

1.创建一个表单,提交多选

2.创建一个接收表单的php文件

[erphpdown]

<?php

/**
* @Author: 吾爱乐享
* @Date: 2018-09-19 01:46:01
* @Last Modified by: 吾爱乐享
* @Last Modified time: 2018-09-19 03:28:47
*/
//数组的基本使用
$arr = array('name' => '张三', 'age' => 23);
echo $arr['age'];//结果23
echo '<br>';
//for循环遍历数组
$arr1 = array(11,22,33,44,55,66,77,88,99);
for($i = 0; $i <=count($arr1)-1; $i++){
echo $arr1[$i].'<br>';
}
//for循环案例
//定义数组
$arr1 = array('张三', 23, '男');
$arr2 = array('李四', 24, '男');
$arr3 = array('王五', 25, '女');
$arr4 = array('赵六', 26, '男');
//foreach循环
//定义关联数组
$arr5 = array('name' => '张三','age' => 23, 'sex' => '男');
$arr6 = array('name' => '李四','age' => 24, 'sex' => '男');
$arr7 = array('name' => '王五','age' => 25, 'sex' => '女');
$arr8 = array('name' => '赵六','age' => 26, 'sex' => '男');
//循环遍历
foreach($arr5 as $key => $value){
echo $key.'=>'.$value.'<br>';
}
//while each list循环
//each()函数
$arr1 = array('name' => '张三','age' => 23, 'sex' => '男');
$new_array = each($arr1);
var_dump($new_array) ;
$new_array = each($arr1);
var_dump($new_array) ;
$new_array = each($arr1);
var_dump($new_array) ;
//list()函数:只能获取索引数组
$arr1 = array('张三',23, '男');
//获取所有的值
list($name,$age,$sex) = $arr1;
echo $name,$age,$sex;
//获取其中一个
list($name) = $arr1;
echo $name;
echo '<br>';
$arr5 = array('name' => '张三','age' => 23, 'sex' => '男');
//while循环遍历
while(list($k,$v) = each($arr5)){
echo $v;
}
echo '<br>';

$arr5 = array('name' => '张三','age' => 23, 'sex' => '男');
if(is_array($arr5)){
foreach($arr5 as $k => $v){
echo $k.'=>'.$v.'<br>';
}
}

?>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<table border=1 width=300 height=100>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
</tr>
<!--for循环遍历数组-->
<tr>
<?php for($i=0; $i<count($arr1); $i++): ?>
<td><?php echo $arr1[$i]; ?></td>
<?php endfor;?>
</tr>
<tr>
<?php for($i=0; $i<count($arr2); $i++): ?>
<td><?php echo $arr2[$i]; ?></td>
<?php endfor;?>
</tr>
<tr>
<?php for($i=0; $i<count($arr3); $i++): ?>
<td><?php echo $arr3[$i]; ?></td>
<?php endfor;?>
</tr>
<tr>
<?php for($i=0; $i<count($arr4); $i++): ?>
<td><?php echo $arr4[$i]; ?></td>
<?php endfor;?>
</tr>
</table>
<table border=1 width=300 height=100>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
</tr>
<!--foreach循环遍历数组-->
<tr>
<?php foreach($arr5 as $k => $v): ?>
<td><?php echo $v; ?></td>
<?php endforeach;?>
</tr>
<tr>
<?php foreach($arr6 as $k => $v): ?>
<td><?php echo $v; ?></td>
<?php endforeach;?>
</tr><tr>
<?php foreach($arr7 as $k => $v): ?>
<td><?php echo $v; ?></td>
<?php endforeach;?>
</tr><tr>
<?php foreach($arr8 as $k => $v): ?>
<td><?php echo $v; ?></td>
<?php endforeach;?>
</tr>
</table>

</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action ="./jieshou.php" method="post">
<input type="checkbox" name="hop[]" value="1">篮球
<input type="checkbox" name="hop[]" value="2">足球
<input type="checkbox" name="hop[]" value="3">羽毛球
<input type="checkbox" name="hop[]" value="4">兵乓球
<input type="checkbox" name="hop[]" value="5">排球
<input type="submit" value="提交">
</form>
</body>
</html>
<?php

/**
* @Author: 吾爱乐享
* @Date: 2018-09-19 03:38:22
* @Last Modified by: 吾爱乐享
* @Last Modified time: 2018-09-19 03:50:14
*/
//接收表单数据
$hop = isset($_POST['hop']) ? $_POST['hop']:'';
//var_dump($hop);
$hop = implode(',',$hop);//把接收到的数组组合成字符串用逗号隔开
var_dump($hop);
$hop = explode(',',$hop);//把字符串逗号位置切割开存为数组,遍历数组取值
//遍历数组
foreach ($hop as $key => $value) {
echo $value;
}

[/erphpdown]

推荐免费资源共享,个人经验总结学习

联系我们联系我们