周一干不干活-PHP+MySQLi
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 Animal extends ACanEat{ //实现接口用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/>";
}
public static function __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/>';
---
困了,回去洗洗睡觉。。。
周一干不干活-PHP+MySQLi的更多相关文章
- 突然发现这周有点忙。。着玩-PHP进阶
hi 周二才,不过我突然意识到这周有点忙着玩的感觉,还是很期待的——今天下午去市里,晚上回来看电影,明晚聚餐吃火锅,后天下午拍短片,晚上可能要打球,周五,嗯,就到周五了.虽然这样下去连怎么写(bian ...
- 2017-2018-1 Java演绎法 第一周 作业
团队学习:<构建之法> [团队成员]: 学号 姓名 负责工作 20162315 马军 日常统计,项目部分代码 20162316 刘诚昊 项目部分代码,代码质量测试 20162317 袁逸灏 ...
- day08整理(周总结\列表\字典内置方法)
一.周总结 一 计算机基础之编程 1.什么是编程语言 编程是人与计算机交流的介质 2.什么是编程 通过编程语言写一堆文件 3,为什么编程 取代劳动力,帮人类干活 二 计算机组成 1.CPU 控制器 控 ...
- 信安周报-第04周:系统函数与UDF
信安之路 第04周 前言 这周自主研究的任务如下: 附录解释: SQLi的时候应对各种限制,可以使用数据库自带的系统函数来进行一系列变换绕过验证 eg:字符串转换函数.截取字符串长度函数等 注入的时候 ...
- 比Mysqli操作数据库更简便的方式 。PDO
下面来说一下PDO 先画一张图来了解一下 mysqli是针对mysql这个数据库扩展的一个类 PDO是为了能访问更多数据库 如果出现程序需要访问其他数据库的话就可以用PDO来做 PDO数据访问抽象层1 ...
- 2015 Autodesk 开发者日( DevDays)和 助力开发周火热报名中
Autodesk 软件(中国)有限公司 ADN 市场部真诚地邀请您参加我们一年一度的 "Autodesk 开发者日"(简称 DevDays),以及第一次随同开发者日举办的" ...
- 记一周cdqz训练
#include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.com/w ...
- java第三周学习
这一周学习的是java数组面向对象 数组中存放的数据的类型:既可以是基本数据类型也可以是引用数据类型. 数组的定义方式: 1 数据类型[] 数组名; 2 数据类型 数组名[]; 数组的初始化: 1.静 ...
- java第二周周学习总结
java运算符和循环 java运算符 一.for 语句 for 语句的基本结构如下所示:for(初始化表达式;判断表达式;递增(递减)表达式){ 执行语句; //一段代码} 初始化表达式:初 ...
随机推荐
- [AngularJS] 使用AngularAMD动态加载Service
[AngularJS] 使用AngularAMD动态加载Service 前言 「使用AngularAMD动态加载Controller」:这篇文章里介绍如何使用AngularAMD来动态加载Contro ...
- clip-path
html代码: <div> <img src="BC0C62C1B1962A8A.jpg"> </div> css代码: img{ clip-p ...
- MontageJS:构建现代 Web App 的 HTML5 框架
MontageJS 可以帮助您构建高可扩展性和可维护性的 HTML5 应用.有了 MontageJS,开发人员可以创建可重用的用户界面组件和模块,组件和控制器之间的绑定属性,并且同步 DOM 查询和更 ...
- jquery实现输入框实时输入触发事件代码
$('.aa').bind('input propertychange', function() { searchProductClassbyName(); }); function searchPr ...
- Titanium中调用ios组件时语言不是本地化的解决方法
用Titanium开发的ios应用中,当调用系统组件时,尽管手机已经设置了系统语言为中文,但那些组件的界面却仍为英文.比如调用iphone中的相册组件,其界面为: 那么怎么让它跟系统语言保持一致呢? ...
- JavaScript入门篇QA总结
Q1:JS可以放在哪个位置?A1:1.放在<head>标签中,用<script type="text/javascript"></script> ...
- '[<NSObject 0x8a4b500> setValue:forUndefinedKey:]
Bug如下: Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUnd ...
- Android studio git 本地仓库和远程仓库节点对比
1.初始状态 2.本地修改文件,然后commit 3.本地再次修改文件,然后commit 4.本地push 从上图可以看出,push完成后,本地仓库的节点和远程仓库的节点是一样的.
- NSoperation用法详解及与GCD的比较
NSInvocationOperation // 基于一个对象和selector来创建操作.如果你已经有现有的方法来执行需要的任务,就可以使用这个类 NSInvocationOperation * o ...
- MJRefresh下拉刷新框架
github下载地址:https://github.com/CoderMJLee/MJRefresh MJRefresh类结构图 self.userTableView.mj_footer = [MJR ...