周一干不干活-PHP+MySQLi

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

hi

本来是雄心壮志的要干活的,哪知天有不测,早上大阴天起不来,中午又回寝室折腾衣服(做女工啊,牛不牛)没睡午觉,这样的迷糊状态,怎么科研,写这个好了。

1、php的OOP编程

4.7 多态

--定义

由于接口的方法实现有多种多样,这种特性称之为多态

--栗子

function eat($obj){

if($obj instanceof ICanEat){

$obj->eat("FOOD"); // 不需要知道到底是Human还是Animal,直接吃就行了

}else{

echo "Can't eat!\n";

}

}

$man = new Human();

$monkey = new Animal();

// 同样的代码,传入接口的不同实现类的时候,表现不同。这就是为什么成为多态的原因。

eat($man);

eat($monkey);

--小结

/**

* 多态

* 1. 只要某个对象实现了接口(instanceof),就可以直接在对象上调用接口的方法

*/

4.8 抽象类

--问题

连接接口的类,某些方法都是相同的,那么是否能够允许类中不实现,而是在接口中实现。

比如,人和动物吃东西不同,但呼吸相同。

--栗子

abstract class ACanEat{ //关键字改变

abstract public function eat($food);//需要类自行实现的,前面加上abstract关键字

public function breath(){

echo "Breath use the air.<br/>";

}

}

class Human extends ACanEat{ //实现接口用implenments,这里用extends

public function eat($food){

echo "Human eating ".$food."<br/>";

}

}

class AnimalextendsACanEat{//实现接口用implenments,这里用extends

public function eat($food){

echo "Animal eating ".$food."<br/>";

}

}

$xiaoming=new Human();

$xiaohei=new Animal();

$xiaoming->breath();$xiaoming->eat("food");

$xiaohei->breath();$xiaohei->eat("shit");

--小结

/**

* 抽象类

* 1. 抽象类允许类里面的部分方法暂时没有具体实现,这些方法我们成为抽象方法

* 2. 一旦类里面有抽象方法,这个类就必须是抽象类

* 3. 抽象类跟接口一样,不能直接实例化为对象

*/

五、魔术方法

5.1 简介

注意所有的魔术方法前面都是两个下划线__

PHP中的OOP特有的。

比如构造函数和析构函数。

5.2 __tostring()和__invoke()

--定义

__tostring(),当对象被当作String使用时,这个方法会被自动调用;echo $obj;

__invoke(),当对象被当作方法(函数)调用时,这个方法被自动调用;$obj(4);

--栗子

<?php

/*

* tostring()魔术方法

* invoke()魔术方法

*/

class MagicTest{

public function __toString(){

return "This is the class magictest.";

}

public function __invoke($x){

echo "<br/>".$x;

}

}

$obj=new MagicTest();

echo $obj;

$obj(5);

用法和构造函数析构函数类似。比较自动化(自动调用,即使没有声明也会调用),但同时比较容易出错,小心。

5.3 __call()和__callStatic()或重载(overloading)

--定义

当对象访问不存在的方法名称时,__call()会被自动调用;

当对象访问不存在的静态方法名称时,__callStatic()会被自动调用;

这两个方法,又称为重载(不同于重写);通过这两个方法,同一个方法的名称的调用可以对应不同的方法实现

--栗子

<?php

/*

* tostring()魔术方法

* invoke()魔术方法

*/

class MagicTest{

public function __toString(){

return "This is the class magictest.";

}

public function __invoke($x){

echo "<br/>".$x."<br/>";

}

public function __call($name,$arguments){ //__call的格式是固定的,第一个是方法名,第二个是方法内的参数

echo "Calling ".$name." with parameters: ".implode(",", $arguments)."<br/>";

}

publicstaticfunction __callstatic($name,$arguments){

echo "Static calling ".$name." with parameters: ".implode(",", $arguments)."<br/>";

}

}

$obj=new MagicTest();

echo $obj;

$obj(5);

$obj->runTest("para1","para2");

$obj::runTest("para3","para4");

注意这里要求定义方法的时候格式是固定的。

5.4 __get()__set()__isset()__unset

--定义

这几个方法也被称为属性重载的魔术方法。

__set(),在给不可访问属性(一种是属性未定义,另一种是没有访问权限,如PRivate)赋值时调用;

__get(),读取不可访问属性的值时调用;

__isset(),当对不可访问属性调用isset()或empty()时调用;

__unset(),。。。。。。。。。unset()。。。。。。。。。。

--栗子

<?php

/*

* tostring()魔术方法

* invoke()魔术方法

*/

class MagicTest{

public function __toString(){

return "This is the class magictest.";

}

public function __invoke($x){

echo "<br/>".$x."<br/>";

}

public function __call($name,$arguments){ //__call的格式是固定的,第一个是方法名,第二个是方法内的参数

echo "Calling ".$name." with parameters: ".implode(",", $arguments)."<br/>";

}

public static function __callstatic($name,$arguments){

echo "Static calling ".$name." with parameters: ".implode(",", $arguments)."<br/>";

}

public function __get($name){ //get要有name

return "Getting the property ".$name."<br/>";

}

public function __set($name,$value){ //set要有名有值

echo "Setting the property ".$name." to value ".$value.".<br/>";

}

public function __isset($name){ //判断是否定义了属性

echo "__isset invoked<br/>";

return true;

}

public function __unset($name){ //撤销

echo "unsetting protery ".$name."<br/>";

return true;

}

}

$obj=new MagicTest();

echo $obj;

$obj(5);

$obj->runTest("para1","para2");

$obj::runTest("para3","para4");

echo $obj->classname;

$obj->classname="shit";

echo isset($obj->classname)."<br/>";

unset($obj->classname);echo "<br/>";

echo empty($obj->classname)."<br/>";

结果是

This is the class magictest.

5

Calling runTest with parameters: para1,para2

Static calling runTest with parameters: para3,para4

Getting the property classname

Setting the property classname to value shit.

__isset invoked

1

unsetting protery classname

__isset invoked

可以看到,其实isset和empty调用__isset时一对相反的操作。

然后,__set($name,$value)和__unset($name)是一对相反的操作,但所要元素不一样;

__isset($name),__get($name)都只需要名字(记住每个魔术方法的作用,理解了,就好记了)。

5.5 __clone()

--定义

就是克隆,或克隆

--栗子

先给出clone关键字的用法。

<?php

/*

* 克隆魔术方法

*/

class nbaPlayer{

public $name;

}

$james=new nbaPlayer();

$james->name='James';

echo $james->name."<br/>";

$kobe=clone $james;

$kobe->name='Kobe';

echo $kobe->name;

clone后的,就是个单独的对象,对其操作不影响原对象。

加上__clone()

<?php

/*

* 克隆魔术方法

*/

class nbaPlayer{

public $name;

public function __clone(){

$this->name="shit";

}

}

$james=new nbaPlayer();

$james->name='James';

echo $james->name."<br/>";

$kobe=clone $james;

echo $kobe->name."<br/>";

$kobe->name='Kobe';

echo $kobe->name."<br/>";

一般来说,用处在于clone后的初始化;或者说,当复制后,不想透露的某些信息的掩盖。

在工作中常用到这一个,因为常有对某个对象的操作,又不想影响原有数据,就克隆/复制一个出来。

----------------------------------------

2、MySQLi扩展

一、安装及下载

1.1 优势及简介

更新更好,PHP5及以后推荐使用(或者PDO)。

--优点

基于OOP和面向过程的使用;

支持预处理语句;

支持事务。

--其他

速度更快。安全性更好

1.2 安装及配置

--安装

配置php,开启php_mysqli.dll;

配置extension_dir='ext目录位置';

重启服务器。

(我用的是WAMP,直接打对勾就行)

--验证

<?php

/*

* 验证mysqli是否开启

*/

//phpinfo();

//2.检测扩展是否已经加载

var_dump(extension_loaded('mysqli'));

var_dump(extension_loaded('curl'));

echo '<hr/>';

//3.检测函数是否存在

var_dump(function_exists('mysqli_connect'));

echo '<hr/>';

//4.得到当前已经开启的扩展

print_r(get_loaded_extensions());

echo '<hr/>';

---

困了,回去洗洗睡觉。。。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航