金刚鹦鹉(学舌(),毛,飞(),生长())==>鹦鹉类(学舌(),毛,飞(),生长())==>生物(生长());
复制代码
[修饰符] class 类名{
[修饰符] [属性]
[修饰符] [方法]
}
复制代码
<?php
class Person{
public $name = 'xiaoming';
public $age = 18;
public $sex = 'man';
}
?>
复制代码
属性中的变量能够初始化,可是初始化的值,必须是常数,能够直接获取值,不须要运算
php
从类实例化对象 $对象名 = new 类名() //"()"可加可不加
mysql
调用类的属性和方法 用->
web
<?php
//定义一个类
class Person{
public name = null;
public function eat(){
echo "吃肉肉..........";
}
public function drink(){
echo "喝酒..........";
}
}
//把这个类实例化
$people = new Person;
$people->drink(); // 输出 喝酒.........
$people->name = "张三"; //属性赋值
echo $people->name; //属性调用
?>
$this 当前方法或属性的调用者
对象之间的赋值,是按引用传递.
复制代码
class A extends B{
}
//A 是子类 B 是父类
复制代码
权限控制符,用来修饰属性和方法redis
权限控制符 public:公共的 protected:受保护的 private:私人的sql
构造方法__construct()__
mongodb
实例化对象时自动触发数据库
析构方法__destruct__
apache
对象销毁时自动触发,触发时的三种方法编程
static 来定义静态属性和静态方法,不用实例化对象,就能够直接访问,只能用类来访问,使用::
来调用windows
<?php
class Test{
public static $course = "English";
public static $score;
}
echo Test::$course; //外部调用
复制代码
<?php
// 内部调用 使用self::属性/方法
class Test{
public static $course = "English";
public static $score = 0;
public static function hello(){
echo self::$score = 100; // 内部调用, 使用self::属性/方法名
}
}
echo Test::hello();
复制代码
定义常量,使用const关键字来定义一个常量,通常常量名都是大写的,区分大小写 常量不能修改值,只能销毁后从新定义
在类中定义的常量只能经过静态方式来调用
经过魔术方法,动态建立类属性和方法
属性重载 当调用当前环境下未定义
或者不可见
的类属性或类方法时,重载方法会被调用
__set()
<?php
class Person
{
private $sex = 'male';
public function __set($name, $value)
{
echo $name, ' ', $value;
}
}
$stu = new Person();
$stu->sex = 'female';
复制代码
__get()
<?php
class Person
{
private $sex = 'male';
protected $age = 39;
public function __get($name)
{
if ($name == 'age') {
echo "年龄 不是你想看, 想看就能看";
}
}
}
$stu = new Person();
$stu->age;
复制代码
isset()
或empty()
时,__isset()
会被调用<?php
class Person
{
private $sex = 'male';
protected $age = 39;
public function __isset($name)
{
echo $name;
}
}
$stu = new Person();
isset($stu->sex);
复制代码
unset()
时,__unset()
会被调用<?php
class Person
{
private $sex = 'male';
protected $age = 39;
public function __unset($name)
{
echo "您正在尝试销毁一个没有权限的属性 $name";
unset(this->$name);
}
}
$stu = new Person();
unset($stu->sex);
复制代码
__call()
会被调用.<?php
class Person
{
private $sex = 'male';
protected $age = 39;
public function __call($name, $arguments)
{
var_dump($name); // 方法名字
var_dump($arguments); // 参数数组
}
protected function getSex()
{
echo $this->sex;
}
}
$stu = new Person();
$stu->getSex(1, 2, 3, 4);
复制代码
__callStatic()
会被调用<?php
class Animal
{
private function eat()
{
echo 'eat';
}
public static function __callStatic($name, $arguments)
{
echo '调用不存在的--静态--方法名是:' . $name . '参数是:';
print_r($arguments);
}
}
$animal = new Animal();
Animal::smile('可爱', '大笑', '微笑');
复制代码
子类继承父类全部的公有的和受保护的属性和方法
<?php
class People
{
public $name = "lisi";
protected $age = 39;
private $salary = 1000;
}
class Person extends People
{
}
$P1 = new Person();
echo $P1->name;
echo $P1->age; // 报错
echo $P1->salary; // 报错
复制代码
继承关键字extends
,一个类继承另外一个类,不能继承多个,能够链式继承
class A extends B; //类A 继承 类B
class C extends A; //类C 继承 类A
复制代码
重写:继承父类中的方法,子类中定义的与父类中同名的方法
当一个子类重写其父类的方法时,PHP不会调用父类中已被重写的方法,是否调用父类的方法取决于子类
<?php
class Person
{
public function sayHi()
{
echo "hi";
}
}
class Student extends Person
{
public function sayHi()
{
echo 'hello';
}
}
$stu = new Student();
$stu->sayHi();
复制代码
关键字 parent::
访问父类中被重写的属性和方法,能够再父类原有的代码上追加新的代码
<?php
class Person
{
public function sayHi()
{
echo "hi";
}
}
class Student extends Person
{
public function sayHi()
{
parent::sayHi();
echo " and say Hello";
}
}
$stu = new Student();
$stu->sayHi();
复制代码
若是一个类被声明为final
,则不能被继承.
<?php
final class Person{
public $name = 'lisi';
}
class Student extends Person{
public $sex = 'male';
} // 报错, 不能继承
复制代码
<?php
// 去掉final, 则没有问题
class Person
{
public $name = 'lisi';
}
class Student extends Person
{
public $sex = 'male';
}
复制代码
若是父类中的方法被声明为final
,则子类没法重写该方法
<?php
// 继承父类的方法
class Person
{
public $name = 'lisi';
public function getName()
{
echo $this->name;
}
}
class Student extends Person
{
public function getName()
{
parent::getName();
echo "\n";
echo "能够继承父类!";
}
}
$stu = new Student();
$stu->getName();
复制代码
一样的代码,若是在getName函数前,添加final,则会报错
<?php
class Person
{
public $name = 'lisi';
final public function getName() // 会报错
{
echo $this->name;
}
}
class Student extends Person
{
public function getName()
{
parent::getName();
echo "\n";
echo "能够继承父类!";
}
}
$stu = new Student();
$stu->getName();
复制代码
Polymorphism
)按字面意思就是'多种状态'abstract
abstract class Person{
abstarct public people(){
}
}
复制代码
<?php
abstract class MyAbsClass
{
abstract public function func();
}
class ChildClass extends MyAbsClass
{
// 这样写会报错, 由于没有实现抽象类中定义的方法
}
复制代码
<?php
abstract class MyAbsClass
{
abstract public function func();
}
class ChildClass extends MyAbsClass
{
public function func()
{
// 即使什么都没有写, 也没有关系...
}
}
复制代码
<?php
abstract class MyAbsClass
{
abstract public function func();
}
abstract class ChildClass extends MyAbsClass
{
// 什么都没写, 也不会报错...
}
复制代码
abstract class MyAbsClass
{
public function func(); // 会报错, 由于没有abstract关键字
}
复制代码
class MyAbsClass // 会报错, 由于没有abstract关键字
{
abstract public function func();
}
复制代码
<?php
abstract class MyAbsClass
{
public $name = '张三';
public $age;
public function test()
{
echo 'hello';
}
abstract public function func();
}
复制代码
final public static function
<?php
interface MyInterface
{
const NUM = 123;
public function func();
public function test();
}
class MyClass implements MyInterface
{
public function func()
{
}
public function test()
{
echo 'hello';
}
}
复制代码
<?php
interface MyInterface
{
const NUM = 123;
public function func();
public function test()
{
echo "test"; // 会报错, 不能有具体方法
};
}
复制代码
<?php
interface MyInterface
{
const NUM = 123;
public function func();
public function test();
}
class MyClass implements MyInterface
{
public function func()
{
}
// 报错, 由于没有实现test()
}
复制代码
<?php
interface MyInterface
{
const NUM = 123;
public function func();
public function test();
}
abstract class MyClass implements MyInterface
{
// 没有实现接口的方法, 也不会报错
}
class Demo extends MyClass
{
public function func()
{
// 必须实现, 不然报错
}
public function test()
{
// 必须实现, 不然报错
}
}
复制代码
<?php
interface A
{
public function aaa();
}
interface B extends A
{
public function bbb();
}
class C implements A
{
public function bbb()
{
//
}
public function aaa()
{
}
}
复制代码
<?php
interface A
{
public function aaa();
}
interface B
{
public function bbb();
}
class C implements A, B
{
public function bbb()
{
// 都得实现, 否则报错
}
public function aaa()
{
// 都得实现, 否则报错
}
}
复制代码
<?php
interface A
{
public function aaa();
}
interface B
{
public function bbb();
}
class C
{
public function bbb()
{
}
public function aaa()
{
}
}
class D extends C implements A, B
{
// 类D继承C, C实现了A和B
}
复制代码
1.抽象类有普通的方法,接口没有
2.抽象类能够有本身的成员属性和方法,接口只能有public 常量。
3.抽象类无关紧要构造方法,接口没有构造方法
4.抽象类单继承,接口多重继承
instanceof
用于肯定一个PHP变量是否属于某一类class的实例<?php
class A
{
}
class B
{
}
$a = new A();
var_dump($a instanceof A); // true
var_dump($a instanceof B); // false
复制代码
instanceof
也可用来肯定一个变量是否是继承自某一父类的子类的实例<?php
class A extends B
{
}
class B
{
}
$a = new A();
var_dump($a instanceof A); // true
var_dump($a instanceof B); // true
复制代码
instanceof
也可用于肯定一个变量是否是实现了某个接口的对象的实例<?php
class A implements B
{
}
interface B
{
}
$a = new A();
var_dump($a instanceof A); // true
var_dump($a instanceof B); // true
复制代码
<?php
class A
{
}
class B
{
}
$a = new A();
$b = new B();
function test(A $n)
{
echo "ok";
}
test($a); // 输出ok
test($b); // 报错, 由于$b是B的实例, 不是A的实例
复制代码
<?php
class A
{
public function aaa(B $n)
{
}
}
class B
{
}
class C extends B
{
public $a = '123';
}
class D extends A
{
}
$a = new A();
$c = new C();
$a->aaa($c);
复制代码
__autoload()
函数也能自动加载类和接口spl_autoload_register()
函数能够注册任意数量的自动加载器,spl_autoload_register()
函数__autoload()
函数,在之后的版本中它可能被弃用定义命名空间
namespace
来声明。定义子命名空间namespace MyProject\Sub\Level;
能够在同一个文件中定义多个命名空间
若是没有定义任何命名空间,全部的类与函数的定义都是在全局空间,与PHP引入命名空间概念前同样。
在名称前加上前缀\表示该名称是全局空间中的名称,即便该名称位于其它的命名空间中时也是如此
__NAMESPACE__
常量
常量__NAMESPACE__
的值是包含当前命名空间名称的字符串
在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。
<?php
namespace hello\hello1;
var_dump(__NAMESPACE__); // hello\hello1
namespace hello\hello2;
var_dump(__NAMESPACE__); // hello\hello2
复制代码<?php
var_dump(__NAMESPACE__); // ""
复制代码非限定名称, 彻底限定名称, 限定名称(绝对路径, 相对路径)
复制代码
<?php
namespace A\B;
class MyClass
{
public function __construct()
{
echo '空间A\B 中的类 实例化了' . "\n";
}
}
namespace A;
class MyClass
{
public function __construct()
{
echo '空间A 中的类 实例化了' . "\n";
}
}
$obj = new MyClass();// 非限定名称 就近
$obj = new \A\B\MyClass();// 彻底限定名称 绝对路径
$obj = new \A\MyClass();// 彻底限定名称 绝对路径
$obj = new B\MyClass();//限定名称 相对路径
复制代码include不会改变当前命名空间, 可是include以后, 可使用引入文件中的命名空间
复制代码
C:\Users\Administrator\Desktop\imooc\aaa.php
复制代码
<?php
namespace aaa;
function demo()
{
echo 'aaa';
}
复制代码
C:\Users\Administrator\Desktop\imooc\bbb.php
复制代码
<?php
namespace bbb;
function demo()
{
echo 'bbb';
}
include 'aaa.php';
demo(); // bbb
var_dump(__NAMESPACE__); // bbb
\aaa\demo(); // 可使用aaa.php的命名空间
动态调用命名空间
复制代码
动态调用函数
<?php
function demo()
{
echo "demo\n";
}
demo(); // 调用demo
$a = 'demo';
$a(); // 一样能够调用demo
复制代码
动态实例化对象
<?php
class A
{
public function demo()
{
echo "demo\n";
}
}
$a = new A();
$a->demo();
$b = "A";
$c = new $b;
$c->demo();
复制代码
//动态调用命名空间
<?php
namespace A\B;
function demo()
{
echo "demo\n";
}
namespace A;
demo(); // 会报错, 由于当前命名空间下, 没有demo()
复制代码<?php
namespace A\B;
function demo()
{
echo "demo\n";
}
namespace A;
\A\B\demo(); // 这就会正常了
复制代码
<?php
namespace A\B;
function demo()
{
echo "demo\n";
}
namespace A;
$a = '\A\B\demo'; // 效果同样, 由于都是彻底限定名称
$a = 'A\B\demo';
$a();
复制代码
<?php
namespace A\B;
function demo()
{
echo "demo\n";
}
namespace A;
$a = 'B\demo'; // 报错, 不支持相对路径
$a();
复制代码
异常
异常处理的实现
try{ //全部须要进行异常处理的代码都必须放入这个代码块内
... // 在这里可使用throw语句抛出一个异常对象
}catch(异常对象参数){ //使用该代码块捕获一个异常,并进行处理
... //在这里作异常处理。也能够再次抛出异常
} [catch(,,){
.. .. ..
}]
复制代码
工做原理
细节
实例
<?php
try {
$error = 'Always throw this error';
throw new Exception($error);
//建立一个异常对象,经过throw语句抛出
echo 'Never executed';
//从这里开始,try代码块内的代码将不会再被执行
} catch (Exception $e) {
echo 'Caught exception:'.$e->getMessage()."\n";
//输出捕获的异常消息
}
echo 'Hello World'; //程序没有崩溃继续向下执行
复制代码
系统自带的异常处理类
自定义异常
捕获多个异常
mysqli优点及其简介
开启mysqli扩展
bool extension_loaded('mysqli');
MySQLi扩展面向对象数据库的使用
$mysqli->set_charset("utf8")
设置数据库编码
4 执行SQL语句 执行查询(select)语句
$mysqli->errno
获得上一部操做产生的错误信息$mysqli-error
的道上一步操做产生的额错误信息执行非查询语句
5 处理资源结果集
$result->free_result()
释放结果集$mysqli->close()
关闭链接和mysqli和mysqli_result相比的优势
效率高,安全,这是咱们使用mysqli_stmt的缘由,因此推荐你使用它
mysqli_stmt预处理类的成员方法
拓展 预处理机制(防止SQL语句恶意注入)
获取预处理语句对象
$stmt=$mysqli->prepare(“insert into tableName values(?,?,?)”);
复制代码
$stmt->prepare(“insert into tableName values(?,?,?)”);
复制代码
绑定参数
$stmt->bind_param(‘类型’,分别对应?的变量名);
给绑定的变量赋值
执行准备好的sql语句,成功时返回 TRUE , 或者在失败时返回 FALSE 。
$stmt->execte($sql);
处理操做的sql语句
$stmt->insert_id; //最后一次插入的id
$stmt->affected_rows; //最后一次操做影响的行数
使用预处理语句处理SELECT查询结果
$stmt->bind_result($result);
while($stmt->fetch()){绑定的变量}
//bool mysqli_stmt::fetch(void)
复制代码
$stmt->close();
$mysqli->close();
<?php
//获取受影响行数
bool $stmt->store_result();//一次性将结果所有取出
$stmt->num_rows;//结果条数(先运行store_result)
// 处理查询结果方式2
$resObj=$stmt->get_result();//获取结果集
$arr=$resObj->fetch_all(MYSQL_ASSOC);//取出全部记录
// 指针移动到n(先运行store_result)
$stmt->data_seek(n);
$stmt->fetch();
?>
复制代码
<?php
$sql ="select id,goodsname,price from yhshop_goods;";
$sql .=" select * from yhshop_admin;";
$res=$mysqli->multi_query($sql);
if($res){
do{
if($mysqli_result=$mysqli->store_result()){
$row[]=$mysqli_result->fetch_all(MYSQLI_ASSOC);
}
}while($mysqli->more_results()&&$mysqli->next_result());
print_r($row);
}else{
echo $mysqli->error;
}
?>
复制代码
事务处理 (多个SQL要完成的任务看为是一个事务)一件事(有任何一个环节出错,都整个事务撤消, 若是都成功才去提交)
目前只有InnoDB和BDB支持事务
默认表都是自动提交的(autocommit)
步骤
PDO的做用
开启PDO 扩展
使用PDO操做数据库
<?php
try {
$dsn = "mysql:host=localhost;dbname=shop";
// 用户名
$user = "root";
// 数据库密码
$pass = "root";
// pdo 对象
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::ATTR_DEFAULT_FETCH_MODE => 2
);
$pdo = new PDO($dsn, $user, $pass, $options);
}
catch (PDOException $e){
echo $e->getMessage();
}
复制代码
$pdo->exec('set names utf8');
处理非查询SQL语句
$pdo->lastinsertid()
PDOStatement对象
PDOStatement对象成员方法
<?php
$username = $_POST['username'];
$username=$pdo->quote($username);//自动为字符串加上引号<br>
$sql='select * from uesr where username={$username}'//这里$username就不用加引号了
$stmt=$pdo->query($sql);//PDOStatement对象的方法:rowCount():对于select操做返回的结果集中记录的条数,对于INSERT、UPDATE、DELETE返回受影响的记录的条数
echo $stmt->rowCount();
?>
复制代码
$pdo=new PDO('mysql:host=localhost;dbname=phptest','root','123456');
$sql="INSERT stu(name,classid) VALUES(:username,:classid)";
$stmt=$pdo->prepare($sql); //返回stmt对象
$stmt->bindParam(":username",$username,PDO::PARAM_STR);
$stmt->bindParam(":classid",$class,PDO::PARAM_STR);//将变量$class的引用绑定到查询的名字参数‘:class’中
$username=king;$class='php05';$stmt->execute();
$pdo=new PDO('mysql:host=localhost;dbname=phptest','root','123456');
$sql="INSERT stu(name,classid) VALUES(?,?)";//一个(没有传值的)SQL语句
$stmt=$pdo->prepare($sql);//准备查询语句
$stmt->bindParam(1,$username,PDO::PARAM_STR);
$stmt->bindParam(2,$class,PDO::PARAM_STR);//将变量$class绑定到查询的第二个问号参数中
$username='lily';$class='php03'; //为变量赋值
$stmt->execute(); //执行参数绑定值后的准备语句
复制代码
Mysql>set autocommit=0;//关闭自动提交
Mysql>start transaction;//开启事务
Mysql>commit;//提交
Mysql>rollback;//回滚
复制代码
//1.关闭自动提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
//2.开启事务:
$pdo->beginTransaction();
//提交一个事务:
$pdo->commit();
//回滚一个事务:
$pdo->rollback();
//检测是否在一个事务内:
inTransaction()
复制代码
try{
$dsn='mysql:host=localhost;dbname=phptest';
$username='root';$passwd='123456';
$options=array(PDO::ATTR_AUTOCOMMIT=>0);
$pdo=new PDO($dsn, $username, $passwd, $options);
$pdo->beginTransaction();//开启事务
$sql='UPDATE userAccount SET money=money-2000 WHERE username="zs"';
$res1=$pdo->exec($sql);
if($res1==0){throw new PDOException(zs转帐失败'); } $res2=$pdo->exec('UPDATE userAccount SET money=money+2000 WHERE username="king"'); if($res2==0){throw new PDOException('king 接收失败');} $pdo->commit();//提交事务 }catch(PDOException $e){ $pdo->rollBack(); //回滚事务 echo $e->getMessage(); } 复制代码
memcache简介
Memcache是一个高性能的分布式的内存对象缓存系统。是个开源的软件,能够经过简单的方法,管理数据库在内存中的存取。简单的说就是缓存数据库查询结果(数据)到内存中,而后从内存中读取,从而大大提升读取速度,减小数据库访问次数,以提升动态web应用的速度,提升可扩展性
怎么理解memcache?====> Memcache 是只有一张表的数据库,这张表有两个字段分别是主键key 和value,value就是咱们要保存的数据,key就是这个数据的id,用来保证咱们查找时候的惟一性
memcache使用场景
Memcache在WEB中的应用
memcache运行图
// memcache 属于一种非关系型数据库 mysql 关系型数据库
// memcache 属于nosql的一种 not only sql redis ,mongodb
// 安装memcache 完整过程
// 1.下载memcache windows 安装包 下载地址: http://static.runoob.com/download/memcached-1.4.5-amd64.zip
// 2.安装包解压到任意磁盘下,个人位置 在E:/phpstudy/memcached.exe .dll
// 3. cmd 安装 memcached.exe -d install /uninstall memcached.exe -d start /stop
// 4. 使用客户端管理工具来链接memcache telnet(windows 命令) 127.0.0.1(服务器地址 localhost) 11211 (端口)
// 5. windows 里开启telnet 客户端的命令
// 6. 开启步骤 计算-->控制面板-->程序-->打开/关闭windows功能-->telnet 客户端 勾选开启
// 7.add 键名 标识 有效期(秒数,0表示永不过时) 长度 / add name 0 0 8 xiaoming
复制代码
stats items 查看标记
stats cachedump 1 0
复制代码
在php中安装memcache拓展详情点击 blog.csdn.net/ad132126/ar…
实例化memcache类 $memcache=new memcache;
链接memcache服务器
参数1:主机(必写);
参数2:Memcached服务的端口号,默认11211(可选)
复制代码
$memcache->close()
memcache->add("test1","This is a test",false,0);
$memcache->add("test2",array("one","two"),MEMCACHE_COMPRESSED,60*60*24*30);
$memcache->add("test3",new Test(),MEMCACHE_COMPRESSED,time()+60*60*24*31);
复制代码
function select($sql,Memcache $memcache){
$key=md5($sql); //md5 Sql命令做为memcache 的惟一标识符
$data=$memcache->get($key);
if(!$data){
try{
$pdo=new PDO("mysql:host=localhost;dbname=php","root","root");
}catch(PDOException $e){
die('链接失败');
}
$stmt=$pdo->prepare($sql);
$stmt->execute();
$data=$stmt->fetchAll(PDO::FETCH_ASSOC);
$memcache->add($key,$data,MEMCACHE_COMPRESSED,0);
}
return $data;
}
$memcache=new Memcache;
$memcache->connect('127.0.0.1',11211);
$data=select("select * from stu",$memcache);
var_dump($data);

复制代码
$memcache = new Memcache;
$memcache->addServer('172.16.1.1', 11211);
$memcache->addServer('172.16.1.2', 11211);
$memcache->addServer('172.16.1.3', 11211);
复制代码
//1. 建立对象
$mem = new Memcache();
//2. 添加服务
$mem->addServer("192.168.150.250",11211);
$mem->addServer("192.168.150.138",11211);
$mem->addServer("192.168.112.128",11211);
//3. 放置信息
$mem->add("mystr","hello memcache!",MEMCACHE_COMPRESSED,0);
$mem->add("myarray",array(10,20,30,40),MEMCACHE_COMPRESSED,0);
$mem->add("myob",new Stu(),MEMCACHE_COMPRESSED,0);
//4. 获取信息
echo $mem->get("mystr")."<br/>";
var_dump($mem->get('myarray'));
echo "<br/>";
$mem->get("myob")->getinfo();
复制代码
bool session_set_save_handler ( callable $open ,
callable $close , callable $read , callable $write ,
callable $destroy , callable $gc [, callable $create_sid ] )
复制代码
session_set_save_handler() 设置用户自定义 会话存储函数。 若是想使用 PHP 内置的会话存储机制以外的方式, 可使用本函数。 例如,能够自定义会话存储函数来将会话数据存储到数据库。这个函数共须要6个回调函数做为必选参数,分别表明了session生命周期中的6个过程,用户经过自定义每一个函数,来设置session周期中每一个环节的信息处理
参数
create table session(
sid char(32) not null default '',
update_time int not null default 0,
data text,
primary key(sid)
);
复制代码