命名空间名称定义有三种:
// 定义一个父空间ns1
namespace ns1 {
class User
{
}
}
// 定义一个子空间ns2
namespace ns2 {
class User
{
}
}
// 定义一个全局空间
namespace one {
class User
{
}
}
以上代码定义了三个命名空间:ns1,ns2,全局空间,并且空间下都有一个User
类,那么我现在在父空间ns1
里分别访问不同空间下的User
类需要这样写:
echo User::class; // ns1\User
echo ns2\User::class; // ns1\ns2\User
echo ns2\User::class; // ns1\ns2\User
echo \one\User::class; // one\User
允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。
PHP命名空间支持三种导入方式:
在PHP中,别名是通过操作符
use
来实现的。
下面是一个导入示例:
// 声明一个命名空间
namespace app\admin\model;
class UserModel
{
# TODO
const cn = __CLASS__;
}
在新建的test.php文件中调用example.php中的UserModel类,通常的做法是:
namespace app\controllers;
// 引入example.php文件
require 'example.php';
// 实例化example.php中的UserModel类
$user = new \app\admin\model\UserModel;
但是我们如果要多次使用UserModel
类,总不能每次都要写一个完整的完全限定名称来导入类,这样就太繁琐了,因此我们可以使用别名来导入类,之后直接使用别名即可。
// 导入空间别名,来简化类的名称
use \app\admin\model\UserModel as UserModel;
// 实例化example.php中的UserModel类
$user = new UserModel;
事实上,使用use
导入的默认就是一个完全限定名称的类,因此可以去掉空间操作符“\”,写成下面这种方法:
use app\admin\model\UserModel as UserModel;
app前面的“\”可以省略掉。
如果别名与原始的类名相同,此时可以省略as
后面的内容。
use app\admin\model\UserModel;
$user = new UserModel;
请思考这么一个问题:如果当前空间的类名与导入的空间的类名相同,应该怎么办?
那么,此时,类别名就不能与当前空间的类名相同了,并且类名别也不可省略。
为当前test.php脚本添加一个UserModel
类。
namespace app\controllers;
// 引入example.php文件
require 'example.php';
// 此时就不能省略别名了,并且别名不能与当前空间的类名冲突。
use app\admin\model\UserModel as User;
// 实例化explame.php脚本中的UserModel类
$user = new User;
// 当前脚本的UserModel类
class UserModel
{
# TODO
}
$user = new UserModel;
在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。
namespace ns {
// $obj = new Demo; // 报错
$obj = new \Demo; // 正确
}
namespace {
class Demo
{
}
}
结论:类名称总是解析到当前命名空间中的名称,并不会去全局查找,因此在访问外部空间类的时候,必须使用完全限定名称。
namespace ns {
function hello () {
echo "Hello World!";
}
echo hello(); // Hello World!
}
namespace {
function hello()
{
return __FUNCTION__;
}
}
结论:在访问函数时,如果当前空间不存在该函数,就会自动去全局查找,如果存在,就直接调用当前空间内的函数。
namespace ns {
echo STR_PAD_RIGHT; // 1
}
namespace {
}
结论:在访问常量时,如果当前空间不存在该常量,就会自动去全局查找,如果存在,就直接调用当前空间内的常量。
1.创建一个明文app的文件夹,并在其下创建一个名为model的子文件夹,该文件夹下有两个类文件:StaffsModel.php
和UsersModel.php
:
namespace app\model;
class StaffsModel
{
}
namespace app\model;
class UsersModel
{
}
在app文件夹下创建一个autoload.php
的文件,里面存放自动加载器:
spl_autoload_register(function ($class) {
$file = str_replace('\\', DIRECTORY_SEPARATOR) . '.php';
require $file;
});
创建一个example.php文件,用来调用上面的两个类:
namespace app;
// 引入类
use app\model\StaffsModel;
use app\model\UsersModel;
// 引入自动加载器
require 'app/autoload.php';
$staffs = new StaffsModel;
$users = new UsersModel;
var_dump($staffs, $users);
Adminer:超轻量级,单文件版本的 Web 版的数据库管理工具。
Navicat Preminum:是一套多连接数据库开发工具,让你在单一应用程序中同时连接多达七种数据库:MySQL、MariaDB、MongoDB、SQL Server、SQLite、Oracle 和 PostgreSQL,可一次快速方便地访问所有数据库。
完整命令:
简写:
-- 创建数据库
CREATE DATABASE 数据库名称 COLLATE unf8mb4_unicode_ci;
-- 选择默认数据库
USE phpedu;
-- 查看建库语句
SHOW CREATE DATABASE 数据库名称;
-- 状态
STATUS
-- 删库
DROP DATABASE 数据库名称;
-- 创建数据表
CREATE TABLE users(
uid INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
name VARCHAR(20) NOT NULL COMMENT '姓名',
gender ENUM('male', 'female') COMMENT '性别',
email VARCHAR(50) NOT NULL COMMENT '邮箱',
birthday DATE NOT NULL COMMENT '生日',
create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',
update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改日期'
) ENGINE = INNODB AUTO_INCREMENT=1 COLLATE=utf8mb4_unicode_ci;
-- 查看表结构
DESC users;
-- 查看建表语句
SHOW CREATE TABLE users;
-- 查看数据库中的所有表
SHOW TABLES;
-- 修改表
-- 1.增加字段:add
-- ALTER TABLE 表名 ADD 字段名 字段类型 是否为空 默认值 AFTER 字段名;
ALTER TABLE users ADD salary INT UNSIGNED NOT NULL DEFAULT 2000 AFTER gender;
-- 2.更新字段:change
-- ALTER TALBE 表名 CHANGE 原始字段名 修改后的字段名 INT UNDIGNED NOT NULL DEFAULT 2000 AFTER 某个字段;
ALTER TABLE users CHANGE salary salary INT UNSIGNED NOT NULL DEFAULT 2000 AFTER gender;
ALTER TABLE users CHANGE gender gender ENUM('male', 'female') NOT NULL AFTER name;
ALTER TABLE users CHANGE salary salary FLOAT UNSIGNED NOT NULL DEFAULT 3000 AFTER gender;
-- 3.删除字段:drop
-- ALTER TABLE 表名 DROP 字段名;
ALTER TABLE users DROP test;
-- 插入数据:insert/insert into
INSERT INTO users (name, gender, email, birthday) VALUES('残破的蛋蛋', 'male', 'admin@admin.cn', '1990-03-31');
-- 插入单条数据,还可以这样操作
INSERT INTO users SET name='拤碎的蛋蛋', gender='female', salary=4500, email='q@admin.cn', birthday='1991-04-26';
-- 批量插入多条数据
INSERT INTO users (name, gender, salary, email, birthday) VALUES
('king','male',6500,'king@php.cn','1992-10-29'),
('amy','female',7800,'amy@163.com','1998-10-22'),
('betty','female',9800,'betty@qq.com','1953-10-19'),
('jack','male',12500,'jack@php.cn', '1977-10-24'),
('marry','female',15800,'marry@php.cn', '1990-01-08'),
('alice','female',8600,'alice@php.cn','1989-09-18'),
('admin','male',16600,'admin@php.cn','1989-09-18'),
('lisa','female',13500,'lisa@qq.com','1983-09-13'),
('peter','male',9600,'peter@163.com','1993-09-29'),
('linda','female',5600,'linda@163.com','1993-09-29');
-- 子查询式插入/复制插入
INSERT INTO users (name, gender, salary, email, birthday)
(SELECT name, gender, salary, email, birthday FROM users);
-- 更新 update
-- 增加一个年龄字段
ALTER TABLE users ADD age INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄' AFTER name;
UPDATE users SET age=timestampdiff(year, birthday, now());
UPDATE users SET salary= salary + 1000 where uid=1;
-- 删除
DELETE FROM users where id=1;
-- ALTER TABLE 表名 AUTO_INCREMENT = n (n表示自增的起始值)
-- 清空表
TRUNCATE test;