Blogger Information
Blog 45
fans 3
comment 0
visits 45635
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
命名空间与数据库基础
残破的蛋蛋
Original
1716 people have browsed it

命名空间与数据库基础

一、命名空间

1.1 命名空间的三种引入方式

命名空间名称定义有三种:

  1. 非限定名称:名称中不包含命名空间分隔符,类似于计算机文件系统的“当前路径”;
  2. 限定名称:名称中含有命名空间分隔符,类似于计算机文件系统的“相对路径”;
  3. 完全限定名称:名称中包含命名空间分隔符,并且是以分隔符开始的标识符,类似于计算机文件系统的“绝对路径”。
  • 命名空间引入示例:
  1. // 定义一个父空间ns1
  2. namespace ns1 {
  3. class User
  4. {
  5. }
  6. }
  7. // 定义一个子空间ns2
  8. namespace ns2 {
  9. class User
  10. {
  11. }
  12. }
  13. // 定义一个全局空间
  14. namespace one {
  15. class User
  16. {
  17. }
  18. }

以上代码定义了三个命名空间:ns1,ns2,全局空间,并且空间下都有一个User类,那么我现在在父空间ns1里分别访问不同空间下的User类需要这样写:

  • 访问ns1下的User类,使用非限定名称。
  1. echo User::class; // ns1\User
  • 访问子空间ns2下的User类,使用限定名称。
  1. echo ns2\User::class; // ns1\ns2\User
  • 访问全局空间的User类,需要使用完全限定名称。
  1. echo ns2\User::class; // ns1\ns2\User
  • 访问全局空间的User类,需要使用完全限定名称。
  1. echo \one\User::class; // one\User

1.2 命名空间的别名/导入

允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。

PHP命名空间支持三种导入方式:

  1. 为类名称使用别名;
  2. 为接口使用别名或为命名空间名称使用别名;
  3. PHP 5.6 开始允许导入函数或常量或者为它们设置别名。

在PHP中,别名是通过操作符use来实现的。

下面是一个导入示例:

  • 新建一个example.php文件
  1. // 声明一个命名空间
  2. namespace app\admin\model;
  3. class UserModel
  4. {
  5. # TODO
  6. const cn = __CLASS__;
  7. }
  • 新建一个test.php文件

在新建的test.php文件中调用example.php中的UserModel类,通常的做法是:

  1. namespace app\controllers;
  2. // 引入example.php文件
  3. require 'example.php';
  4. // 实例化example.php中的UserModel类
  5. $user = new \app\admin\model\UserModel;

但是我们如果要多次使用UserModel类,总不能每次都要写一个完整的完全限定名称来导入类,这样就太繁琐了,因此我们可以使用别名来导入类,之后直接使用别名即可。

  1. // 导入空间别名,来简化类的名称
  2. use \app\admin\model\UserModel as UserModel;
  3. // 实例化example.php中的UserModel类
  4. $user = new UserModel;

事实上,使用use导入的默认就是一个完全限定名称的类,因此可以去掉空间操作符“\”,写成下面这种方法:

  1. use app\admin\model\UserModel as UserModel;

app前面的“\”可以省略掉。

如果别名与原始的类名相同,此时可以省略as后面的内容。

  1. use app\admin\model\UserModel;
  2. $user = new UserModel;

请思考这么一个问题:如果当前空间的类名与导入的空间的类名相同,应该怎么办?

那么,此时,类别名就不能与当前空间的类名相同了,并且类名别也不可省略。

  • 示例:

为当前test.php脚本添加一个UserModel类。

  1. namespace app\controllers;
  2. // 引入example.php文件
  3. require 'example.php';
  4. // 此时就不能省略别名了,并且别名不能与当前空间的类名冲突。
  5. use app\admin\model\UserModel as User;
  6. // 实例化explame.php脚本中的UserModel类
  7. $user = new User;
  8. // 当前脚本的UserModel类
  9. class UserModel
  10. {
  11. # TODO
  12. }
  13. $user = new UserModel;

1.3 空间成员的访问优先级

在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。

1.3.1 示例:在空间中访问全局类

  1. namespace ns {
  2. // $obj = new Demo; // 报错
  3. $obj = new \Demo; // 正确
  4. }
  5. namespace {
  6. class Demo
  7. {
  8. }
  9. }

优先级

结论:类名称总是解析到当前命名空间中的名称,并不会去全局查找,因此在访问外部空间类的时候,必须使用完全限定名称。

1.3.2 示例:在空间中访问函数

  1. namespace ns {
  2. function hello () {
  3. echo "Hello World!";
  4. }
  5. echo hello(); // Hello World!
  6. }
  7. namespace {
  8. function hello()
  9. {
  10. return __FUNCTION__;
  11. }
  12. }

结论:在访问函数时,如果当前空间不存在该函数,就会自动去全局查找,如果存在,就直接调用当前空间内的函数。

1.3.3 示例:在空间中访问常量

  1. namespace ns {
  2. echo STR_PAD_RIGHT; // 1
  3. }
  4. namespace {
  5. }

结论:在访问常量时,如果当前空间不存在该常量,就会自动去全局查找,如果存在,就直接调用当前空间内的常量。

1.4 利用命名空间的知识实现一个自动加载器

1.创建一个明文app的文件夹,并在其下创建一个名为model的子文件夹,该文件夹下有两个类文件:StaffsModel.phpUsersModel.php

  • StaffsModel.php
  1. namespace app\model;
  2. class StaffsModel
  3. {
  4. }
  • UsersModel.php
  1. namespace app\model;
  2. class UsersModel
  3. {
  4. }

在app文件夹下创建一个autoload.php的文件,里面存放自动加载器:

  1. spl_autoload_register(function ($class) {
  2. $file = str_replace('\\', DIRECTORY_SEPARATOR) . '.php';
  3. require $file;
  4. });

创建一个example.php文件,用来调用上面的两个类:

  1. namespace app;
  2. // 引入类
  3. use app\model\StaffsModel;
  4. use app\model\UsersModel;
  5. // 引入自动加载器
  6. require 'app/autoload.php';
  7. $staffs = new StaffsModel;
  8. $users = new UsersModel;
  9. var_dump($staffs, $users);

二、MySQL基础命令

2.1 管理工具

  • Adminer:超轻量级,单文件版本的 Web 版的数据库管理工具。

  • Navicat Preminum:是一套多连接数据库开发工具,让你在单一应用程序中同时连接多达七种数据库:MySQL、MariaDB、MongoDB、SQL Server、SQLite、Oracle 和 PostgreSQL,可一次快速方便地访问所有数据库。

2.2 数据库的连接与退出

2.2.1 查询版本

  • mysql -V

2.2.2 连接数据库

完整命令:

  • mysql -h 主机地址 -P 3306 -u 账户名 -p 密码 -D mysql

简写:

  • mysql -u 账户名 -p 密码

2.3 sql 语句分类

  • DDL: 数据定义, create, alter,drop
  • DML: 数据操作, insert, update,delete,select,(CURD)
  • DCL: 数据控制, grant, revoke
  • TCL: 事件控制, commit, rollback

2.4 数据库操作

  1. -- 创建数据库
  2. CREATE DATABASE 数据库名称 COLLATE unf8mb4_unicode_ci;
  3. -- 选择默认数据库
  4. USE phpedu;
  5. -- 查看建库语句
  6. SHOW CREATE DATABASE 数据库名称;
  7. -- 状态
  8. STATUS
  9. -- 删库
  10. DROP DATABASE 数据库名称;

2.5 数据表操作

  1. -- 创建数据表
  2. CREATE TABLE users(
  3. uid INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
  4. name VARCHAR(20) NOT NULL COMMENT '姓名',
  5. gender ENUM('male', 'female') COMMENT '性别',
  6. email VARCHAR(50) NOT NULL COMMENT '邮箱',
  7. birthday DATE NOT NULL COMMENT '生日',
  8. create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',
  9. update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改日期'
  10. ) ENGINE = INNODB AUTO_INCREMENT=1 COLLATE=utf8mb4_unicode_ci;
  11. -- 查看表结构
  12. DESC users;
  13. -- 查看建表语句
  14. SHOW CREATE TABLE users;
  15. -- 查看数据库中的所有表
  16. SHOW TABLES;
  17. -- 修改表
  18. -- 1.增加字段:add
  19. -- ALTER TABLE 表名 ADD 字段名 字段类型 是否为空 默认值 AFTER 字段名;
  20. ALTER TABLE users ADD salary INT UNSIGNED NOT NULL DEFAULT 2000 AFTER gender;
  21. -- 2.更新字段:change
  22. -- ALTER TALBE 表名 CHANGE 原始字段名 修改后的字段名 INT UNDIGNED NOT NULL DEFAULT 2000 AFTER 某个字段;
  23. ALTER TABLE users CHANGE salary salary INT UNSIGNED NOT NULL DEFAULT 2000 AFTER gender;
  24. ALTER TABLE users CHANGE gender gender ENUM('male', 'female') NOT NULL AFTER name;
  25. ALTER TABLE users CHANGE salary salary FLOAT UNSIGNED NOT NULL DEFAULT 3000 AFTER gender;
  26. -- 3.删除字段:drop
  27. -- ALTER TABLE 表名 DROP 字段名;
  28. ALTER TABLE users DROP test;

2.6 增删改查(CURD)

  1. -- 插入数据:insert/insert into
  2. INSERT INTO users (name, gender, email, birthday) VALUES('残破的蛋蛋', 'male', 'admin@admin.cn', '1990-03-31');
  3. -- 插入单条数据,还可以这样操作
  4. INSERT INTO users SET name='拤碎的蛋蛋', gender='female', salary=4500, email='q@admin.cn', birthday='1991-04-26';
  5. -- 批量插入多条数据
  6. INSERT INTO users (name, gender, salary, email, birthday) VALUES
  7. ('king','male',6500,'king@php.cn','1992-10-29'),
  8. ('amy','female',7800,'amy@163.com','1998-10-22'),
  9. ('betty','female',9800,'betty@qq.com','1953-10-19'),
  10. ('jack','male',12500,'jack@php.cn', '1977-10-24'),
  11. ('marry','female',15800,'marry@php.cn', '1990-01-08'),
  12. ('alice','female',8600,'alice@php.cn','1989-09-18'),
  13. ('admin','male',16600,'admin@php.cn','1989-09-18'),
  14. ('lisa','female',13500,'lisa@qq.com','1983-09-13'),
  15. ('peter','male',9600,'peter@163.com','1993-09-29'),
  16. ('linda','female',5600,'linda@163.com','1993-09-29');
  17. -- 子查询式插入/复制插入
  18. INSERT INTO users (name, gender, salary, email, birthday)
  19. (SELECT name, gender, salary, email, birthday FROM users);
  20. -- 更新 update
  21. -- 增加一个年龄字段
  22. ALTER TABLE users ADD age INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄' AFTER name;
  23. UPDATE users SET age=timestampdiff(year, birthday, now());
  24. UPDATE users SET salary= salary + 1000 where uid=1;
  25. -- 删除
  26. DELETE FROM users where id=1;
  27. -- ALTER TABLE 表名 AUTO_INCREMENT = n n表示自增的起始值)
  28. -- 清空表
  29. TRUNCATE test;
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post