PHP对象的串行化与反串行化
最后更新于:2022-04-01 21:42:29
什么时候使用串行化?
在网络中传输对象的时候
向数据库中保存文件的时候
今天我们要提到四个函数
全部串行化
1.serialize(对象名) 将指定的类对象串行化 $str=serialize($per) //将per对象串行化,结果返回给$str
2.unserialize(串行化后的返回值) 返回结果是对象 $per=unserialize($str);
局部串行化
3.__sleep() 串行化某对象的部分属性。
4.__wakeup()反串行化时,初始化(其实是修改)对象内容
前两个的使用方法我们大概已经介绍过,接下来我们简单介绍一下__sleep()和__wakeup()使用方法
1.如果我们只想串行化一个对象中的部分属性我们可以使用 __sleep()函数
在类定义中添加
function__sleep()//只序列化类中的name和age成员
{
$arr=new array('name','age'); name和age必须是类中的属性 可以根据自己的实际需要增加
Return arr;
}
2.假如我们在类串行化的时候,per对象的name属性值为“姜彤”在反序列化的时候我想改成"张三"怎么办
function __wakeup()
{
This->name="张三";
}
';
PHP中的面向对象总结
最后更新于:2022-04-01 21:42:27
抽象方法:没有方法体,和{}且被abstract修饰的方法
抽象类:至少包含一个抽象方法的类
抽象类的用途:用于**定义一种规范**,继承该类必须将该抽象类中的抽象法方全部都实现
接口中只能能包含方法的定义
接口只能包含常量
继承接口必须将接口中的方法全部实现,也用于一种规范
接口和抽象类的区别
Abstractclass class1
{
可以包含成员属性
可以包含普通方法
至少有一个抽象方法
}
Interface face1
{
所有属性必须是常量
所有方法都是抽象的(指只有方法,并不被abstract修饰)
所有成员必须是public类型
}
一个类只能继承一个抽象类,但可以继承多个接口
Class class1extends class2 //继承类
Class class2 implementsface1,face2,face3
Extends==implements 二者可以替换
多态
PHP是弱类型的,多态在PHP中体现的不是那么明显,在同一个类中不能存在两个同名的方法,因为PHP无法按照类型来区分两个方法,这点不同于强类型语言,但是PHP可以重载父类的方法,或者实现接口中的方法
';
PHP Smarty环境配置
最后更新于:2022-04-01 21:42:24
Smaty优点:1.代码分离 2.缓存技术
使用步骤:
1.下载Smaty模板
2.将模板中那个lib文件夹复制到项目中(一般为根目录,并且重命名在此命名为Smarty),
3.配置PHP
1.新建一个Smarty_inc.php文件
2.输入
Include_once("Smarty/Smarty.class.php");//包含Smarty类
$smarty=new Smarty();//实例化Smarty对象
//配置
Smarty使用变量
定义变量
$smarty->assign("模板变量","值/数组");
将改变量应用到特定的模板中
$smarty->display("模板名");
Eg:
~~~
$smarty->assign("title","我的第一个smarty程序");
$smarty->display("index.html");
在index.html中使用
{$title}
~~~
上述一次只能访问一个变量那么**怎样循环访问多个变量呢**?**
要想访问多个变量必须用到数组
定义
~~~
$array={name->"jiangtong",name->"张三",name->"李四"}
$smarty->assign($student,$name);
$smarty->display("index.html");
~~~
**在**index.html**中使用**
、
Smarty取出当前时间
{$smarty.now}
';
$smarty->config_dir="Smaryt/Config_File.class.php"; | 配置文件目录路径,一般不更改 |
$smarty->caching=false; | 是否开启缓存 |
$smarty->template_dir="./templates"; | 设置模板目录,手动创建,./代表当前目录必须设置 |
$samrty->complie_dir="./templates_c"; | 设置编译目录,手动创建,必须设置 |
$smarty->cache_dir="./smarty_cache"; | 设置缓存目录 |
$smarty->left_delimiter="{";和$smarty->right_delimiter="}"; | 设置在HTML标志Smarty的开始和结束标签自定义也可以世{%和%} |
{section name="stuList" loop="$student"} | loop代表循环那个数组 |
<p>{$student[stuList].name}</p> |
|
<sectionelse> //可以不写 |
|
{/section} |
|
PHP环境(apache,PHP,Mysql)详细配置方法
最后更新于:2022-04-01 21:42:22
**安装前的准备:下载PHP,apache,mysql安装包,可以到相关官网上下载,下面是安装步骤**
**1.**安装**Apache**,**直接运行安装即可,我们将其安装到D:/PHP/Apache/ 目录下**
**2.**将**PHP**压缩包解压内容放到指定**PHP**目录(自己指定这里是D:/PHP/,并重命名为PHP5,将**PHP5目录中的PHP.iniDevelopment重命名为php.ini**)
**3.**修改**Apache**配置文**件(D:\PHP\Apache\conf\httpd.conf)
1.加载PHP模块 在Apache配置文件添加
LoadModule php5_module "D:/PHP/PHP5/php5apache2_2.dll" //D:/PHP/PHP5/为php安装目录
2. 添加AddType application/x-httpd-php .php .phtml //设置apache解文件类型
//指定php配置文件路径
3. 添加phpinidir "D:/PHP/PHP5" 设置php配置文件目录(先确保PHP安装目录中的PHP.iniDevelopment重命名为php.ini)
**4.**重启**Apache**
**5.验证PHP是否安装成功**
这里我们在D:\PHP\Apache\htdocs目录下创建一个phpinfo.php文件输入以下内容
~~~
~~~
然后打开浏览器输入http://localhost/phpinfo.php ,默认的是80端口,如果不是80端口localhost后面必须加端口号,如果安装成功,则打开PHP相关信息页面,否则检查相关目录是否安装正确
**6.安装mysql服务,直接运行mysql安装文件,按照提示一步一步的执行安装操作**
**5**添加**Mysql**模块
1.在PHP5目录下ext目录找到libMysql.dll或php_mysql.dll和 php_mysqli.dll 复制到C盘Windows目录下
2.打开PHP配置文件
1.取消extension=php_mysql.dll和extension=php_mysqli.dll前面分号去掉
2.在php.ini中设置扩展路径extension_dir="D:/PHP/PHP5/ext"
3.重启Apache
4.在浏览器再次访问phpinfo.php页面,如果页面信息多了mysql和mysqli列表示添加模块成功,否则重新检查上述步骤
验证mysql是否
';
PHP常用魔术方法总结
最后更新于:2022-04-01 21:42:20
常用的魔术方法有:__Tostring () __Call() __autoLoad() __ clone() __GET() __SET() __isset() __unset()
**1.__Tostring() 用于定义输出对象引用时调用 常用于打印一些对象的信息**必须有返回值
eg:有一个persion类
Persion per =new persion()
Echo per; //直接调用会出错
我们可以在类的定义中添加__tostring()方法
Function __Tostring()
{
$str=this->$name.this->age;
Return $str;
}
**2.__clone()**对象的复制**
引用赋值
$per1=$per2;而这在内存中只有一块地址
而$per1=clone $per2 这时有两块内存地址
**3.__call()方法**当调用类实例中不存在的函数时自动执行**
如果试图调用类中不存在的函数,会出现语法错误,为了能够友好的提示
我们可以在类中声明Call()方法;
Function __call($funName,$argu)
{
Echo "名为".$funName."参数为".printf($argh)."的函数不存在",
}
**4.__autoLoad自动加载使用的类文件 该函数是在引用的页面添加**
我们都使用过这样情况,在页面中需要调用其他php文件,我们需要使用include方法
但是如果有几十个页面需要引用,未免太过繁琐,我们可以在该页面中使用autoload方法
Function __autoload($className)
{
Include $className.".php";
}
这样凡是引用到其他类的地方,都会自动引用该类文件 前提类文件的名称必须是 类名.php
5.__GET() 访问类中私有属性
如果类中的属性设置为私有属性,在类的实例中是无法访问的,但怎样才能访问呢?
我们就可以使用__GET()
Eg:
类中有
Class person
{
Private $name;
Private $age;
}
实例化 person per=new person()
Per->$name; //这样是取不到值的
但是如果我们在类中增加__GET方法
Function __GET($proName)
{
Return this->$proName;
}
我们再次调用Per->$name就可以访问了
这样做有人会提出疑问了,这样可以直接访问私有变量,和声明成公有的有什么区别呢?
如果声明成公有的,我们可以任意读取,如果是私有,如果我们增加了get方法,那么每次调用私有属性都会调用GET方法的内容,这样我们就可以在get方法中增加一些逻辑处理。
6.__SET()设置类中的私有属性
原理同上,我们可以再类中添加__SET()函数,每当通过调用类实例给私有属性赋值,都会执行__SET函数,函数原型:
Function __SET($proName,$value)
{
This->$proName=$value;
}
既然是方法赋值,我们就可以做一些逻辑处理
7.__isset()判断类中私有属性或方法是否存在时自动调用
首先我们先介绍一下isset方法,该方法用于判定属性和方法是否存在,但是我们无法通过类类实例判断类中的某个私有属性是否存在
如果我们使用isset(per->$name);//返回值是false,但是$name属性的确存在,怎么解决呢?
解决方法:
1.将$name定义为私有属性
2.
在类定义中添加
Function __isset($proName)
{
Return isset(this->$proName);//再类内部是可以访问私有属性的
}
这样的话我们再次调用isset($name);返回值就为true了;
8.__unset()清除类中私有变量时自动调用
与之结合的是unset() unset方法可以删除属性,当我们需要删除类中属性的时候,如果是公有属性我们可以直接
删除,但是如果是私有我们只通过该方法就无法实现了
怎样实现呢我们可以使用__unset()方法实现该功能我们需要在类中添加
Function __unset($proName)
{
Unset(this->$proName);
}
现在我们再调用unset($name);就可以删除person类中的私有属性$name了
';
PHP数据类型总结
最后更新于:2022-04-01 21:42:18
PHP共有8中数据类型:
| **类型名称**| **类型表示**| **取值**|
|-----|-----|-----|
| bool | 布尔型 | true,false |
| integer | 整型 | -2147483647-2147483648 |
| string | 字符串型 | 字符串长度取决于机器内存 |
| float | 浮点型 | 最大值1.8e308 |
| object | 对象 | 通过new实例化 $obj=new person(); |
| array | 数组类型 | $arr=array(1,2,3,4,5,6);//一维数组 |
| resourse | | |
| null | 空值 | null |
**布尔型bool :**
对于其他类型我们可以使用(bool)或者(boolean) 进行强制转换 eg:(bool)1=true;
以下几种情况在强制转化的时候默认为false:
| **转换**| **结果**|
|-----|-----|
| 布尔型的false var_dump((bool) false) | bool(false) |
| 整型 0 var_dump((bool) 0); | bool(false) |
| 浮点型 0.0 var_dump((bool) 0.0); | bool(false) |
| 字符串 ‘0’ var_dump((bool) '0'); | bool(false) |
| 空数组$arr=array(); var_dump((bool) $arr) | bool(false) |
| 不包含任何成员变量的空对象只在PHP4使用,PHP5中为true | bool(false) |
| NULL或者尚未赋值的变量 var_dump((bool) NULL) | bool(false) |
| 从没有任何标记(tags)的XML文档生成的[SimpleXML]() 对象 | bool(false) |
字符串'0.0'转换结果为bool(true)
**注:-1和其他非零值(不论正负)都是true**
**整型integer:**
整型的范围-2147483647--2147483647 ,如果超过该值会自动转换成float型
我们可以使用echo PHP_INT_SZIE 输出integer的字长,和机器有关。echo PHP_INT_MAX 输出integer的最大值
PHP中没有整除运算 如果执行 1/2 会产生 float的0.5 如果想实现整除效果,则可以使用 (int)(1/2)=0 或者使用round(25/7)=4
强制转化成整型 (int)或者(integer) bool型 ture 转换成 1 ,false转换成0
**浮点型float:**
取值范围 最大值 :1.8e308 不知道最小值是多少? 求高手告知
浮点数的字长也和机器有关, 好像没有PHP_FLOAT_SIZE 啊,求高手告知如何的到浮点数字长
**字符串类型string:**
**定义字符串的4种方法**:
1.单引号
2.双引号
3.heredoc语法结构
4.nowdoc 语法结构(PHP5.3.0之后)
**单引号**
单引号定义了最原始的字符串,里面的所有内容都按字符串处理,如果字符串中包含单引号则可以用\转义
**双引号**
双引号定义的字符串会解析一些特殊字符(\n,\b)和变量
可以将变量放置在双引号中的方式来代替将变量转换成 字符串(string):
$num=10;
$str = "$num"; //$str为字符串型的10
**heredoc语法结构**
**<<<标示符**
**字符串本身**
**标示符**
结束时的标示符必须在一行的开始位置,而且标示符的定义格式也必须按照PHP定义的规则,只能包含数字,字母,下划线,并且不能以数字下划线开头
结束标示符哪一行不允许有其他字符,可以在标示符后面添加一个分号,切分号前后也不能有tab或空格,否则PHP将无法解析该标示符,会继续向下查找标示符,如果在文件结尾前仍没有找到则会产生一个错误
heredoc就是一个没有使用双引号的双引号,就是里面可以包含双引号,且不用转义,而且可以解析特殊字符和变量
**nowdoc 语法结构**
**<<<'标示符'**
**字符串本身**
**标示符**
nowdoc的开始标示符必须使用单引号括起来,结束标示符和其他规则都和heredoc一样
nowdoc就是没有使用单引号的单引号,nowdoc包含的字符串会原样输出,里面包含的特殊字符和变量不会被解析
**如果双引号中包含数组变量中的几种情况**
**//**我们先定义以下数组
~~~
$arr=array(
'one'=>array(
'name'=>'jiangtong',
'sex'=>'男'
),
'two'=>'zhaohaitao',
'three'=>'fanchangfa'
);
~~~
上面是的数组中第一个元素二维的,后两个是一维的,我们访问一维的时候下面几种方式:
~~~
echo "$arr[two]"//key没有单引号
echo "$arr['two']"//key有单引号 会出错,如果我们改成 echo "{$arr['two']}"; 则可以正确输出结果
echo "{$arr[two]}"//有双大括号,但是key没有单引号 这种情况PHP会先寻找有没有常量banana,有的话则将其替换,由于没有two常量则出错
~~~
**可见在访问一维数组的时候 要么不加key不加引号(考虑到第三种情况啊),加了就要被{}括起来,可以全不加。**
**多维数组测试**
~~~
echo "$arr[one][name]"; //输出结果为Array[name] 可见它返回了一个数组,只解析了一维
echo"{$arr['one']['name']}";//输出结果为jiangtong
~~~
**在多维数组的访问中必须使用了大括号key必须使用双引号括起来**
**数组类型**
在字符串类型中已经提到,被大括号括起来的,如果不加key引号,是合法的,那么PHP首先会查找是否有名为key的常量,有的话就会被替换,没有的话会产生一个找不到常量的警告才按普通字符串处理,所以建议大家一定加单引号
转换成数组使用(array)type 或者array(type) ,但是如果将只有一个值的转换成数组,会得到一个元素的数组,且下标为0,将NULL转换成数组会得到空的数组
我们可以在遍历数组的时候改变数组的值,在PHP5.0以上可以使用引用实现
~~~
$arr=array('a','b','c','d','e' );
foreach($arr as &$value)
{
$value=strtoupper($value);
echo $value;
}//输出结果 ABCDE
~~~
**Object对象类型**
实例化对象我们使用new 加入有一个person类,我们可以通过以下方式
~~~
$objPerson=new person();
~~~
强制转换 (object): 如果将一个对象转化成对象那么它没有任何改变,对于其他任何值将会实例化一个stdclass的对象,如果该值为NULL,则会实例化一个空对象,如果 将数组转换成对象那么会将数组的key作为对象的属性,value为属性值,其他类型的值则名为scalar的成员变量包含该值
~~~
$arr=array('one'=>'a','two'=>'b' );
$obj=(object)$arr;
echo $obj->one //输出结果为a;
~~~
**注:这是由key的数组如果没有字符key的数组,我不知道如何访问,谁知道希望告诉小弟一下,谢谢。**
对于其他值
~~~
$obj1=(object)'jiang';
echo $obj1->scalar;//输出结果jiang
~~~
>
**NULL 空类型**
null大小写不敏感,NULL类型只有一个取值,表示一个变量没有值,下面三种情况变量被认为为NULL
1.被赋值为NULL
2.尚未被赋值
3.被unset();
';
PHP通用的分页组件(分页加绑定数据)
最后更新于:2022-04-01 21:42:15
**最近整理了一下项目中用到的一些分页组件,将其封装起来(可以说1.0版本),希望大侠们多提提意见,来,先看一下运行效果**
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/0510d21c7f7818f684f668ef4c283376_727x340.gif)
样式可能不是太美观,不过我已将样式与功能分离,这样大家就可以根据自己的需要的风格定义样式了,先说下我这个组件的**优点:**
**
**1.将分页与数据绑定合在一个文件输出**
2**.灵活性高:不局限于某一个表,我们可以通过传表名来获取不同的结果,表内字段名完全自动识别**
**3.可以按照条件查询数据**
**4.每页显示的条数也只是一个参数**
**下面看一下代码**
~~~
1)//如果页数大于1进行分页
{
$pagination .= "";
echo '
";
echo $pagination;
}
?>
~~~
**下面看一下调用方法 调用很简单只是根据情况传递参数**
**
~~~
$page='ManageNews.php';//要提交的页面
$adj=3;//要查询的页面两边各放几个按钮
$limit=10;//每页要显示的条数
$table='news';//查询的表名
$strwhere=" where sort="."'".$sort."'"; //查询的where 条件
$addPage='AddNews.php?newid=';//添加要跳转的页面
$sql="SELECT id, title, addDate, (CASE sort WHEN '0' THEN '科技新闻' WHEN '1' THEN '最新活动' WHEN '2' THEN '技术服务' WHEN '3' THEN '诚聘英才' END ) AS sort, click FROM `news`" ; //要执行的查询语句
$arrayTitle=array('编号','标题','类型','发布时间','点击次数','修改','删除');//数据绑定每列的标题 必须和下面的每列的列名对应
$arrayColName=array('id','title','sort','addDate','click','xg1125','sc1125');//数据表中要显示的列名,当为xg1125时表示修改,sc1125删除
echoPage($page,$adj,$limit,$table,$sql,$arrayTitle,$arrayColName,$strwhere,$sort,$addPage);
~~~
**以上就是我整理的分页逻辑,自己发现的问题:健壮性有待提高,我会尽快的完善一下,希望大家能够多提提意见,小弟不胜感激,我定会虚心接受。**
';
";
//previous button 上一页
if ($page > 1)
$pagination.= "« previous";
else
$pagination.= "« previous";
//pages
if ($lastpage < 7 + ($adjacents * 2)) //页面小于13页,全部显示
{
for ($counter = 1; $counter <= $lastpage; $counter++)
{
if ($counter == $page)
$pagination.= "$counter";
else
$pagination.= "$counter";
}
}
elseif($lastpage > 5 + ($adjacents * 2)) //页面大于11页隐藏部分分页
{
//close to beginning; only hide later pages
if($page < 1 + ($adjacents * 2)) //如果分页值为7一下的显示方式
{
for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)//显示1搭配9
{
if ($counter == $page)
$pagination.= "$counter";
else
$pagination.= "$counter";
}
$pagination.= "...";
$pagination.= "$lpm1";
$pagination.= "$lastpage";
}
//in middle; hide some front and some back
elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))//如果分页值离左右边界的距离都大于6
{
$pagination.= "1";
$pagination.= "2";
$pagination.= "...";
for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)//则显示分页值为中心左边6个右边6个
{
if ($counter == $page)
$pagination.= "$counter";
else
$pagination.= "$counter";
}
$pagination.= "...";
$pagination.= "$lpm1";
$pagination.= "$lastpage";
}
//close to end; only hide early pages
else
{
$pagination.= "1";
$pagination.= "2";
$pagination.= "...";
for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
{
if ($counter == $page)
$pagination.= "$counter";
else
$pagination.= "$counter";
}
}
}
//next button
if ($page < $counter - 1)
$pagination.= "next »";
else
$pagination.= "next »";
$pagination.= "
\n";
}
//实现绑定数据功能
echo "ID | "; //echo'标题 | '; //echo'类型 | '; //echo'发布时间 | '; //echo'点击次数 | '; //echo'修改 | '; //echo'删除 | '; foreach($arrayTitle as $title) { echo''.$title.' | '; } echo '|||
---|---|---|---|---|---|---|---|---|---|---|
".$row['title']." | "; else if($col=='xg1125') echo "修改 | "; else if($col=='sc1125') echo "删除 | "; else echo "".$row[$col]." | "; //正常情况下的输出 } //echo "".$row['ID']." | "; //echo "".$row['title']." | "; //echo ".".$row['sort']." | "; //echo ".".$row['Date']." | "; //echo "".$row['click']." | "; //echo "修改 | "; //echo "删除 | "; echo '
php中如何使用KindEditor编辑器
最后更新于:2022-04-01 21:42:13
前不久做了一个小网站,发布新闻的时候,同事推荐了一个好的富文本编辑器kindeditor,觉得用的挺方便,今天在这总结一下,简单的介绍一下kindeidtor使用,这里只将核心的一些配置说明列在下面,首先说一下准备工作:
1.下载:Kindeditor编辑器(是一个文件夹,在这重命名为eidtor)将其放在网站根目录下面,
2.引用:在同一级目录中创建一个news.php文件,用来引用该编辑器,下面是news.php中的内容
~~~
~~~
该段代码中第一段js脚本主要是用来引用editor编辑器js文件(必须的),第二段js代码主要设置编辑器的样式,里面的东西大家可以根据需要增减,每一项的具体含义我在这不多说,大家可以参考网上的一些说明
3.配置eidtor编辑器,富文本编辑器有一个重要的功能是可以上传一些图片,使用之前需要进行配置,打开eidtor文件夹下
php文件夹下的upload_json.php文件,进行配置
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/c77368b1fb76f57d621795932c174217_377x131.gif)
editor默认的将图片放到了editor文件夹下的attached文件夹下,大家可以根据需要更改,同时也可以限制上传文件的大小,和文件类型.
经过上面的设置,就可以使用图文并茂的编辑器了。
';
前言
最后更新于:2022-04-01 21:42:11
> 原文出处:[PHP入门到精通](http://blog.csdn.net/column/details/phpspecialcolumn.html)
作者:[jt521xlg](http://blog.csdn.net/jt521xlg)
**本系列文章经作者授权在看云整理发布,未经作者允许,请勿转载!**
# PHP入门到精通
> PHP一些语法,特性,方法的总结,内容涵盖了PHP入门到深入的所有环节
';