变量

基本属性

  1. 变量以$开头,不需要声明;
  2. 变量区分大小写
  3. 弱类型语言,不必声明变量类型

    作用域

    分为local,global,static,parameter四种类型;

  4. local和global

全局变量可以在其他地方直接访问,但是不能在函数中直接访问;
访问的方法:

  • 在函数中使用global声明,声明后可以使用

    1. <?php
    2. $x = 2;
    3. function inner(){
    4. global $x;
    5. echo $x;
    6. }
    7. ?>
  • 所有的全局变量直接存储在$GLOBALS变量中,所以可以通过$GLOBALS['x']访问

    1. <?php
    2. $x = 2;
    3. function inner(){
    4. echo $GLOBALS['x'];
    5. }
    6. ?>
  1. static

静态作用域可以保留变量不被销毁

  1. <?php
  2. $x = 5;
  3. function inner(){
  4. static $x = 0;
  5. echo $x;
  6. $x++;
  7. echo PHP_EOL;
  8. }
  9. inner();
  10. inner();
  11. ?>
  1. 参数作用域

函数参数所用的变量

类型比较

php是一门弱类型语言,==只比较值,===比较值和类型。这点和javascript相同

常量

php常量定义后在整个脚本中可用,使用define语法
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
第一个参数是常量名称,第二个参数是值,第三个参数表示大小写是否敏感,默认敏感(php8.1已被弃用)

  1. <?php
  2. function greeting() {
  3. define('jay', 'jay');
  4. }
  5. greeting();
  6. echo jay, ' defined in function'; // 输出jay defined in function
  7. ?>

字符串

  1. php字符串单双引号有差别

    • 单引号优先级高,不会解析变量
    • 双引号优先级低,会解析变量
      1. <?php
      2. $a = 2;
      3. echo '单引号优先级高,不会解析变量 $a。';
      4. echo "双引号优先级低,会解析变量$a";
      5. ?>
  2. 使用.连接字符串

    1. <?php
    2. echo '使用.'.'连接字符串';
    3. ?>
  3. strlen获取字符串字节长度(中文3字节,英文1字节?)

    1. <?php
    2. echo strlen('使用strlen获取字符串字节长度'); // 3*11 + 1*6 = 39
    3. ?>
  4. strpos获取某一子串在字符串中的位置,长度按字节算,找不到返回FALSE(这是什么意思,打印不出来)

    1. <?php
    2. $res1 = strpos('使用strlen获取字符串字节长度', '用');
    3. $res2 = strpos('使用strlen获取字符串字节长度', '1');
    4. echo $res1;
    5. echo $res2;
    6. ?>
  5. 定界符语法

nowdoc语法和单引号行为一致,语法类似js中的模板字符串,使用<<<'T' T语法,其中T可自定义但是必须一致

  1. $a = <<<'EA'
  2. this is from
  3. he she it
  4. EA;
  5. echo $a;
  6. /*
  7. this is from
  8. he she it
  9. */
  1. heredoc语法

heredoc语法和双引号行为一致,语法是<<<T T,和nowdoc的不同是第一个T没有单引号。
使用双引号同样能达到效果

  1. $b = 2;
  2. $a = <<<EA
  3. this is from $b
  4. he she it
  5. EA;
  6. echo $a;
  7. $c = "
  8. this is from $b
  9. he she it
  10. ";
  1. php并没有对unicode做底层支持,所以处理多字节字符要使用mb_*方法

    运算符

    php运算符和javascript类似,但也有和别处不同地方

  2. .并置,用于连接两个字符串,扩展的有.=

  3. and or xor与,或,异或,用于逻辑运算;and &&相同,or ||相同
  4. <>不相等,和!=相同
  5. <=>组合比较,大于返回1,等于返回0,小于返回-1
  6. 有些运算符==, ===, !=, <>还可用于数组的对比

    数组

    数组是php中用一个变量存储多个值的类型,使用array()创建,分为数值数组和关联数组,

  7. 数值数组:键的值从0开始自动分配的数组,对应js中普通意义上的数组

    1. <?php
    2. $arr = array('this', 'is', 'normal');
    3. echo $arr[0];
    4. echo $arr[1];
    5. echo $arr[2]; // thisisnormal
    6. ?>
  8. 关联数组:手动分配键的数组,符合js中对象的定义

    1. <?php
    2. $arr = array('a'=>'this', 'b'=>'is', 'c'=>'normal');
    3. echo $arr['a'];
    4. echo $arr['b'];
    5. echo $arr['c'];
    6. echo count($arr);// thisisnormal3
    7. ?>
  9. 使用count()获取数组长度

  10. sort()对数组升序排序,在前面添加其他词可以额外定制

r降序排序
k对键排序,针对关联数组
a对值排序,针对关联数组

超级全局变量

超级全局变量全局可用,不需要特殊的说明

  1. $GLOBALS存储了所有全局变量的数组
  2. $_SERVER 由web服务器创建,包含名称,路径,头信息,脚本位置等信息
  3. $_REQUEST收集表单提交的数据 ```php
Name:

<?php $name = $_REQUEST[‘fname’]; echo $name; ?>

  1. 4. `$_POST``$_GET`用于postget请求
  2. 4. 其他`$_FILES``$_ENV``$_COOKIE``$_SESSION`
  3. <a name="lXLaj"></a>
  4. ### foreach
  5. 针对数组的循环,可以输出keyvalue
  6. ```php
  7. foreach ($arr as $value) {
  8. print_r($value);
  9. }
  10. foreach ($arr as $key=>$value) {
  11. print_r($key);
  12. print_r($value);
  13. }

魔术常量

php中预定义了大量的魔术常量,可以获取当前环境的一些元信息

  1. __LINE__当前行
  2. __FILE__当前绝对路径文件名
  3. __DIR__当前绝对路径文件夹
  4. __FUNCTION__函数名称
  5. __CLASS__类型名称
  6. __TRAIT__复用?不太懂
  7. __METHOD__类的方法名
  8. __NAMESPACE__命名空间 ```php <?php echo ‘this is line ‘.LINE.PHPEOL; echo ‘this locate at ‘.FILE.PHPEOL; echo ‘this in the ‘.__DIR.’ dirctionary’.PHP_EOL;

function test() { echo ‘function name is ‘.FUNCTION.PHP_EOL; } test(); ?>

  1. <a name="cA1Qp"></a>
  2. ### 名词空间
  3. 名词空间和c++类似,有以下知识点:
  4. 1. namespace除了定义源文件编码方式的`declare()`语句不能有其他代码
  5. 1. namespace可以不加括号,下面的代码在该名词空间中直到遇到下一个名词空间
  6. ```php
  7. <?php
  8. declare(encoding='UTF-8');
  9. namespace f;
  10. $a = 1;
  11. echo $a;
  12. namespace wp_publish_once;
  13. $a = 2;
  14. echo $a;
  15. ?>
  1. namespace加括号,全局代码必须在namespace{}
  2. 支持子空间father/son
  3. 可以通过namespace/foo()访问全局变量中的foo()函数
  4. 使用__NAMESPACE__可以得到当前名词空间名称,全局为""
  5. 导入命名空间use,设置别名use as
  6. 导入的命名空间由上到下有顺序性
  7. 命名空间内部访问全局同名变量的方法,添加\ ```php namespace { function e() {
    1. echo 'outer';
    } }

namespace { function f() { echo ‘inner’; \e(); } f(); }

  1. <a name="YHRFG"></a>
  2. ### 类
  3. 1. 类使用`public, protected, private`声明变量和函数,还可以用`var/public`声明变量
  4. 1. `const`声明常量不需要使用`$`,类外面使用`class_name::const_name`的形式访问`const``static`,还可以使用使用`instance_name::static_name`访问`static`变量
  5. 1. php类中使用`self::const_name`访问`const`常量和`static`变量,使用`$this->var_name`(no $)访问变量
  6. 1. 抽象方法必须在抽象类中
  7. 1. 静态变量`static`可以不实例化访问
  8. 1. 类的`final`不可被继承,方法,变量的`final`不可悲=被子类覆盖
  9. 1. 子类构造函数**不自动**调用父类的构造函数,使用`parent::__construct()`手动调用
  10. ```php
  11. class sub extends Animal {
  12. function __construct(){
  13. class sub extends Animal {
  14. function __construct(){
  15. parent::__construct();
  16. }
  17. });
  18. }
  19. }

switch

switch在比较的时候的逻辑是==

  1. $a = '4';
  2. switch ($a) {
  3. case 4:
  4. echo 'got'; // 匹配
  5. case '4':
  6. echo 'get'; // 匹配
  7. case 5:
  8. echo 'g';
  9. default:
  10. break;
  11. }

日期和时间

  1. DateTime是表示日期的类
  2. DateInterval是表示时间间隔的类
  3. DatePeriod是表示时间间隔的类

    其他

  4. intval($param, $base)

将变量转化为整数值

  1. array_push($arr, $val1, $val2)

将一个或多个单元压入数组末尾

  1. implode($separator, $arr)

将数组按分隔符转化成字符串

Wordpress

1. bloginfo($name)

获取信息博客的相关信息,如site name,tag name等

2. single.php

wordpress在用户访问某个博客的the_permalink()的时候,优先寻找single.php作为模版,如果不存在就使用默认的index.php
page.php同理
header.php可以使用get_header()加载
footer.php可以使用get_footer()加载

3. add_action

在指定的action上挂载一个函数,这个函数会在do_action的时候触发

4. wp_head

在头部加载文件,一般为css等

5. wp_footer

在HTML文件结尾加载文件,一般是js文件,wp_footer默认加载wordpress的bar

6. 加载样式

wp_enqueue_style($name, $src)加载样式文件
本地的src可以使用get_theme_file_uri
远程使用//开头的链接

7. get_theme_file_uri

获取主题的目录

8. 加载脚本

wp_enqueue_scirpt($name, $src, $dependencies, $version, $load_bottom)
$dependencies是该脚本依赖的数组
$version是版本
$load_bottom是否在body底部加载脚本

9. add_action('after_setup_theme', $function)

主题加载完成后触发

10. add_theme_support($feature, $args)

添加一些特性,如网站的title,logo等,需要在add_action('after_setup_theme', $function)中的函数触发
add_theme_support('title_tag')添加网站的title为当前page的title

12. 著名的loop,wordpress对post/page的循环

have_posts()迭代时是否有还有post
the_post()准备好类似the_content这样的数据
the_content()文章的内容
the_title()文章的标题
the_author_post_link()可点击的作者的链接
the_time($format)文章发表的时间,可以在官网查看format格式
get_the_category_list($seperator)获取文章的分类,如果有多个用$seperator分隔

13. site_url($src)

当前wordpress站点下的文章的链接,可以用来链接到另一个页面,$src不填默认是首页

14. 获取ID

get_the_ID()获取当前页面的ID
wp_get_post_parent_id($id)获取某个post ID的父页面ID,如果没有父页面则返回0。如果$id为0则获取当前页面的父页面ID

15. 根据ID获取

get_the_title($id)根据文章ID获取标题
get_permalink($id)根据文章ID获取文章链接

16. wp_list_pages($arr)

输出陈列子菜单的li列表

  1. wp_list_pages(array(
  2. /** 是否显示标题行 */
  3. 'title_li' => NULL,
  4. /** 显示父页面/本页面的子菜单 */
  5. 'child_of' => $findChildrenOf,
  6. /** 默认按照字母排序,这里根据设置的order排序 */
  7. 'sort-column' => 'menu_order'
  8. ));

17. header和body相关的函数

language_attributes()检测浏览器语言并输出,可以在html tag中输出语言设置
bloginfo('charset')检测博客语言并输出,可以设置meta charset
body_class()输出当前body使用的class,可以得到当前页面相关的信息

18. menu注册菜单,添加菜单

register_nav_menu($name, $description)after_setup_theme的钩子函数中可以注册菜单名称
wp_nav_menu($arr)可以在wp-adminAppearence/Menu菜单中设置好后使用这个函数在HTML中使用这个函数显示菜单

  1. wp_nav_menu(array(
  2. 'theme_location' => 'footerLocationOne'
  3. ));

19. is_page($slug)

根据slug判断当前页面是否是$slug页面,如is_page('about-us')

20. 档案archive

分类(caterory)的博客优先匹配archive.php,档案包含category,author,日期等
the_archive_title()档案的题目
the_archive_description()档案的描述
is_category()判断当前页面是否是分类
is_author()判断当前页面是否是作者类别

21. 自定义查询Custom Query

wordpress支持自定义查询,使用WP_Query($arr)类,支持一些查询参数:

  • posts_per_page单页的数量
  • category_name分类的名称
  • 。。。

返回一个可迭代的对象,迭代方式和全局的类似。

使用wp_reset_postdata()重置$post相关的参数

22. 缩减内容wp_trim_words

wp_trim_words($str, $number) $str是需要缩减的内容,$number是限制单词的个数

23. get_post_type

获取类型,所有posts相关的页面都是返回post,page是特殊的post

24. do_action('init')

钩子函数,在wordpress加载完成但是headers还没设置之前,这里我们可以设置自定义类型Custom type

25. register_post_type($arr)

注册一个自定义类型,可以自定义一些行为如文本等

  1. register_post_type('event', array(
  2. /** 直接添加以下功能 */
  3. 'supports' => array('title', 'editor', 'excerpt'),
  4. 'rewrite' => array(
  5. /** 将url中的event重写成events */
  6. 'slug' => 'events'
  7. ),
  8. /** 这个自定义类型支持分类 */
  9. 'has_archive' => true,
  10. 'public' => true,
  11. // 使用现代编辑器
  12. 'show_in_rest' => true,
  13. 'labels' => array(
  14. 'name' => 'Events',
  15. 'add_new_item' => 'Add New Event',
  16. 'edit_item' => 'Edit Event',
  17. 'all_items' => 'All Event',
  18. 'singular_name' => 'Event'
  19. ),
  20. 'menu_icon' => 'dashicons-calendar'
  21. ));

如果使用rewrite重写了slug,在浏览器的固定链接中则只能使用events,所以在导航到新链接的时候不能硬编码site_url('/events')。可以使用get_post_type_archive_link('event')

26. 全局触发的插件

wp-content/mu-plugins下的插件直接运行且在仪表盘页面无法修改。

27. 摘要excerpt

摘要在新注册的type中使用supports来增加

  1. register_post_type('event', array(
  2. 'supports' => array('excerpt'),
  3. ));
  1. `has_excerpt()`判断是否拥有摘要<br />`get_the_excerpt(), the_excerpt()`摘要内容

28. 自定义字段ACF

the_field($key)根据key查value并显示
get_field($key)返回value
自定义字段的查询实例,以查询没有过期的最近的event为例

  1. $today = date('Ymd');
  2. $homepageEvents = new WP_Query(array(
  3. /** -1代表返回所有参数 */
  4. 'posts_per_page' => -1,
  5. 'post_type' => 'event',
  6. /** 查询的key */
  7. 'meta_key' => 'event_date',
  8. /** 按照值(_num表示这是数字)排序 */
  9. 'orderby' => 'meta_value_num',
  10. /** ASC正序,DESC倒叙 */
  11. 'order' => 'ASC',
  12. /** meta相关的查询条件,很语义化:event_date >= today, 比较的方式是数字 */
  13. 'meta_query' => array(
  14. array(
  15. 'key' => 'event_date',
  16. 'compare' => '>=',
  17. 'value' => $today,
  18. 'type' => 'numeric'
  19. )
  20. )
  21. ));

29. 修改默认的查询

修改默认的基于URL的查询query,在add_action('pre_get_posts', $func_name);中修改,使用$query->set('meta_key', $key_name)全局修改查询的条件。

  1. function university_adjust_query($query) {
  2. if(!is_admin() AND is_post_type_archive('event') AND $query->is_main_query()) {
  3. $today = date('Ymd');
  4. $query->set('meta_key', 'event_date');
  5. $query->set('orderby', 'meta_value_num');
  6. $query->set('order', 'ASC');
  7. $query->set('meta_query', array(
  8. array(
  9. 'key'=>'event_date',
  10. 'compare'=>'>=',
  11. 'value'=>$today,
  12. 'type'=>'numeric'
  13. )
  14. ));
  15. }
  16. }
  17. add_action('pre_get_posts', 'university_adjust_query');
  1. `is_admin`判断是否是仪表盘界面<br />`is_post_type_archive($post_type)`判断post的类型,可以是Custom Field<br />`is_main_query()`可以判断query是否是默认基于URLquery

30. 自定义查询的分页

WP_Query中添加paged表明当前查询所在的分页。
get_query_var('paged', $default)WP_Query中检索查询到的变量的值,可选添加默认值
paginate_links(array('total'=>$query->max_num_pages))分页的组件,只支持默认的query,自定义的query需要totalpaged

  1. $today = date('Ymd');
  2. $pastEvents = new WP_Query(array(
  3. 'paged' => get_query_var('paged', 1),
  4. 'post_type' => 'event',
  5. 'meta_key' => 'event_date',
  6. 'orderby' => 'meta_value_num',
  7. 'order' => 'ASC',
  8. 'meta_query' => array(
  9. array(
  10. 'key' => 'event_date',
  11. 'compare' => '<',
  12. 'value' => $today,
  13. 'type' => 'numerical'
  14. )
  15. )
  16. ));
  17. echo paginate_links(array(
  18. 'total' => $pastEvents->max_num_pages
  19. ));

31. 关联两个不同类型的post

Custom Field的Filed Type选择**Relationship**
获取关联的post:通过get_field($field)获取关联的$post类型的数组,
获取被关联的post:WP_Query通过$filed进行meta_query查询,ID需要字符串查找

  1. 'meta_query' => array(
  2. array(
  3. 'key' => 'related_programs',
  4. 'compare' => 'LIKE',
  5. 'value' => '"' . get_the_ID() . '"'
  6. )
  7. )