吾爱乐享
个人学习博客

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

吾爱乐享阅读(14)

成员方法

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

案例:

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学习之类与对象基础知识,适合初学者

吾爱乐享阅读(21)

小案例-快速入门

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

  •  最初的解决方法:

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

  • 数组的解决方式:

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

    $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学习之数组的相关知识-冒泡排序

吾爱乐享阅读(33)

说明:

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

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

排序的分类:

  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学习之数组的相关知识-二维数组的相关知识

吾爱乐享阅读(42)

1.定义

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

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

创建方式一:

创建方式二:

创建方式三:

多维数组创建

多维数组的使用

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

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

吾爱乐享阅读(56)

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文件

您暂时无权访问此隐藏内容!

php学习之数组的相关知识-注意事项

吾爱乐享阅读(52)

1.数组的介绍

说明:一组数据的集合,数组是由元素组成

案例:求学生的总分数和平均分数

常规的做法:

<?php

/**
* @Author: 吾爱乐享
* @Date: 2018-09-17 22:16:42
* @Last Modified by: 吾爱乐享
* @Last Modified time: 2018-09-17 22:33:03
*/
//求学生的总分数和平均分数
//常规的做法
$yuwen = 70;
$shuxue = 90;
$yingyu = 50;
$tiyu = 100;
$sum = $yingyu + $shuxue +$yingyu + $tiyu;
$ave =$sum / 4;
echo “总分数为:{$sum},平均分数:{$ave}”;

数组的做法:

<?php

/**
* @Author: 吾爱乐享
* @Date: 2018-09-17 22:16:42
* @Last Modified by: 吾爱乐享
* @Last Modified time: 2018-09-17 22:33:03
*/
//求学生的总分数和平均分数
//数组的做法
$arr = array($yingyu, $shuxue, $yingyu, $tiyu);
$sum = 0;
$num = 0;
for($i = 0; $i<count($arr); $i++){
$sum += $arr[$i];//总分数
$num++;//总的科目数
}
$ave = $sum / $num;//平均分数
echo “总分数为:{$sum},平均分数:{$ave}”;

2.数组的创建

数组有三种创建方式:

  1. 变量 = array(元素1,元素2,元素3,……);
  2. 变量 = array(元素的值1,元素的值2,元素的值3,…..);
  3. 变量[下标] = 值;
//数组的创建
//方式一:变量 = array(元素1,元素2,元素3,......);
$arr1 = array('name' => '张三', 'age' => 23, 'sex' => '男');
echo '方式一:<br>';
var_dump($arr1);
//方式二:变量 = array(元素的值1,元素的值2,元素的值3,.....);
$arr2 = array('李四', 24, '男');
echo '方式二:<br>';
var_dump($arr2);
//方式三:变量[下标] = 值;
$arr3['name'] = '王五';
$arr3['age'] = 25;
$arr3['sex'] = '女';
echo '方式三:<br>';
var_dump($arr3);

数组的注意事项

  1. 元素是由下标组成,也称键值对
  2. 下标是每个数据值的对应的名称,一个数组中可能有相同的值,用下标来定位和区分对应的值
  3. 下标可以自定义也可以系统自动生成,自定义的下标的数组称为关联数组,系统生成的数组称为,索引数组,索引数组是的下标是从0开始的
  4. 如果自定义了下标,就会按照自定义的下标区分数据,没有下标的就从0开始依次递增
  5. 如果其中定义了一个数字,那么这个数组后面的数据的下标就从定义的这个数字开始依次递增
  6. 下标又称索引键名,index和offset
  7. 数值也称键值,数组中数值的数据类型为8种
  8. 数组的覆盖,在同一个数组中,如果后面的元素中的下标和前面元素的下标重复了,那么后面的元素的值就会覆盖前面的元素值
  9. 数组的自增,在一个已知的数组中添加新的元素,$旧的数组变量名[] = 新的元素
  10. 数组分为索引数据和关联数组和混合数组
    1. 索引数组:下标都是数字,且连续的递增的方式
    2. 关联数组:下标都是字符串
    3. 混合数组:既有数字又有字符串

全部案例代码:

您暂时无权访问此隐藏内容!

php学习之函数的常见用法

吾爱乐享阅读(111)

函数:

把一个或一些功能进行封装,然后走可以在任何地方去使用。分为自定义函数系统函数

1.普通函数

自定义函数语法:

function 函数名 ([形参列表]){

函数体;

[return 返回值];

调用函数:直接使用函数名();

只要调用函数都会开启新栈,来运行函数代码

2,可变函数

把一个变量的值当成函数的名,

如何实现:

在变量的后面加括号,变量一但加上括号系统就会解析成函数

$a=’b’;

$a();//此时的就相当于$a=b();

3.匿名函数

就是没有名字的函数

如何实现:

把这个函数赋值给变量,通过可变函数方式调用

$a = function(){

函数体;

}

$a();

4.回调函数

在一个函数内部调用另一个函数

function a(){

b();

}

function b(){

echo 1;

}

a();//调用函数

或者

function a($b){

$b();

}

function b(){

echo 1;

}

a(‘b’);//调用函数,把值b传给$b,调用$b(),就相当于$b=b();

5.匿名函数

把一个函数直接当作实参传递

function a($b){

$b();

}

a(function() {

echo 1;

});

6,内部函数

在一个函数内再次定义函数,这时候内部函数只能在函数内使用,要想在外部调用内部函数,必须先调用外部函数在调用内部函数

function a(){

function b (){

echo 1;

}

b();

}

a();

7.递归调用

调用的一种方式,也叫一种思想,在函数内部再次调用自己

前提是有条件的并且需要考虑退出条件的调用,二者缺一不可,否则进入死归

function a(){

if(条件语句){

a(退出条件);

}

函数体

}

a();//调用函数

php学习之网站布局方式【案例全过程】

吾爱乐享阅读(69)

网站布局方式:

代码实现:

1.创建目录

2.创建配置文件,在config目录下新建一个conn.php文件

<?php
/**
* @Author: 吾爱乐享
* @Date: 2018-09-09 21:45:08
* @Last Modified by: 吾爱乐享
* @Last Modified time: 2018-09-09 22:25:10
*/
//配置文件
//设置编码
header("Content-type:text/html;charset=utf-8");
//配置网站目录结构
define('ROOT',substr(str_replace('\\','/',__DIR__),0,-6));//网站根目录
define('STYLE_ROOT',ROOT . 'style/');//样式文件路径
define('JS_ROOT' , ROOT . 'js/');//js文件路径
define('IMAGES_ROOT' , ROOT . 'images/');//图片文件路径
define('LIB_ROOT' , ROOT . 'lib/');//工具库文件路径
define('TEMPS_ROOT', ROOT . 'temps/');//模板文件路径
define('TEMPS_HOME_ROOT' , TEMPS_ROOT . 'home/');//前端文件路径
define('TEMPS_ADMIN_ROOT' , TEMPS_ROOT . 'admin/');//后端文件路径
//配置数据库连接信息
$link = array(
'host' => 'localhost',
'root' => 'root',
'pass' => '',
'charset' => 'utf8',
'dbname' => 'student'
);

3.实现功能-封装函数

4.引入文件

 

php学习之函数的其他函数的使用

吾爱乐享阅读(63)

1。可变函数

说明:就是一个变量如果加上括号,php的系统就会解析成函数,这个变量的值必须是一个函数的名。否则报错,未定义

案例:

2,回调函数

说明:在一个函数中调用另一个函数,这时候称为回调

案例:

3.匿名函数

说明:匿名函数就是没有名称的函数,这时候就需要一个变量来存储函数

案例:

4,内部函数

说明:在一个函数内部在定义一个函数,这个时候,里面的函数只能在函数内使用,不能在函数外部使用,防止外链调用函数,这种方式的函数不多,面向对象都是这中方式

案例:

5.递归思想

说明:在一个函数内部再次有条件的调用自己(当前函数),这个时候就称为递归调用,即自己调用自己

案例:

注意:

1,递归调用必须有个可以退出的条件,否则无法退出递归调用,就会成为死循环,也就是说必须逐渐的退出

2,在递归调用时每次调用一次函数都开辟一个新的栈,这些栈是没有关系的

案例:

每个数据都是由前面的两个数字的和,第一个和第二个除外1,1,2,3,5,8,13,21,34….通过索引查找对应的数

php学习之函数的认识及相关细节

吾爱乐享阅读(62)

1.函数的介绍

说明:函数的作用在于对一个功能的封装,封装后在别的页码中引入并调用,可以节省代码量

语法:

function 函数名 ( [形参1][,形参2][,形参3][,形参4][,形参n]){

要封装的函数的代码;

[return 返回值];

}

2,函数的调用

说明:直接使用需要调用的函数的名即可

语法:

函数名([实参1][,实参2][,实参3][,实参4][,实参n]);

3.函数的相关细节

  1. 函数定义时的形参不是一个具体的数值,而是需要接收实参传过来的值,且形参必须是变量
  2. 形参可以给默认值,且可以是多种数据类型
  3. 实参就是要给函数传递数据的值。可以是具体的值。也可以是变量。实参必须和形参一一对应
  4. 函数名遵循变量的定义规则。字母、下划线、数字且不能以数字开头
  5. 函数名不能重复
  6. return返回值,如果写了就会返回当前要返回的值,如果没写默认返回一个1或者null
  7. return可以返回多个值,即可以返回一个数组
  8. 返回值必须使用一个变量到函数的调用者这个位置进行接收
  9. 可以利用数组传递多个值
  10. 函数的变量称为局部变量,不能在函数外使用

说明:

2.函数的调用机制

说明:

  1. 函数的调用者把实际的数据传递给函数的形参,这时候的形参只能在函数内使用
  2. 函数在运行代码时会新建一个新的空间来运行函数内的代码
  3. 运行代码后,如果有返回值,把结果返回给函数调用者,这时候运行的函数新的空间被销毁

图解:

引用传递

说明:有的函数可以直接使用全局变量。这时候是引用传递

案例:

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

联系我们联系我们