- 变量
- 基本属性
- 作用域
- 类型比较
- 常量
- 字符串
- 运算符
- 数组
- 超级全局变量
- 魔术常量
- switch
- 日期和时间
- 其他
- Wordpress
- 1. bloginfo($name)
- 2. single.php
- 3. add_action
- 4. wp_head
- 5. wp_footer
- 6. 加载样式
- 7. get_theme_file_uri
- 8. 加载脚本
- 9.
add_action('after_setup_theme', $function) - 10.
add_theme_support($feature, $args) - 12. 著名的loop,wordpress对post/page的循环
- 13.
site_url($src) - 14. 获取ID
- 15. 根据ID获取
- 16.
wp_list_pages($arr) - 17. header和body相关的函数
- 18. menu注册菜单,添加菜单
- 19.
is_page($slug) - 20. 档案archive
- 21. 自定义查询Custom Query
- 22. 缩减内容
wp_trim_words - 23.
get_post_type - 24.
do_action('init') - 25.
register_post_type($arr) - 26. 全局触发的插件
- 27. 摘要excerpt
- 28. 自定义字段ACF
- 29. 修改默认的查询
- 30. 自定义查询的分页
- 31. 关联两个不同类型的post
变量
基本属性
全局变量可以在其他地方直接访问,但是不能在函数中直接访问;
访问的方法:
在函数中使用
global声明,声明后可以使用<?php$x = 2;function inner(){global $x;echo $x;}?>
所有的全局变量直接存储在
$GLOBALS变量中,所以可以通过$GLOBALS['x']访问<?php$x = 2;function inner(){echo $GLOBALS['x'];}?>
- static
静态作用域可以保留变量不被销毁
<?php$x = 5;function inner(){static $x = 0;echo $x;$x++;echo PHP_EOL;}inner();inner();?>
- 参数作用域
类型比较
php是一门弱类型语言,==只比较值,===比较值和类型。这点和javascript相同
常量
php常量定义后在整个脚本中可用,使用define语法bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
第一个参数是常量名称,第二个参数是值,第三个参数表示大小写是否敏感,默认敏感(php8.1已被弃用)
<?phpfunction greeting() {define('jay', 'jay');}greeting();echo jay, ' defined in function'; // 输出jay defined in function?>
字符串
php字符串单双引号有差别
- 单引号优先级高,不会解析变量
- 双引号优先级低,会解析变量
<?php$a = 2;echo '单引号优先级高,不会解析变量 $a。';echo "双引号优先级低,会解析变量$a";?>
使用
.连接字符串<?phpecho '使用.'.'连接字符串';?>
strlen获取字符串字节长度(中文3字节,英文1字节?)<?phpecho strlen('使用strlen获取字符串字节长度'); // 3*11 + 1*6 = 39?>
strpos获取某一子串在字符串中的位置,长度按字节算,找不到返回FALSE(这是什么意思,打印不出来)<?php$res1 = strpos('使用strlen获取字符串字节长度', '用');$res2 = strpos('使用strlen获取字符串字节长度', '1');echo $res1;echo $res2;?>
定界符语法
nowdoc语法和单引号行为一致,语法类似js中的模板字符串,使用<<<'T' T语法,其中T可自定义但是必须一致
$a = <<<'EA'this is fromhe she itEA;echo $a;/*this is fromhe she it*/
- heredoc语法
heredoc语法和双引号行为一致,语法是<<<T T,和nowdoc的不同是第一个T没有单引号。
使用双引号同样能达到效果
$b = 2;$a = <<<EAthis is from $bhe she itEA;echo $a;$c = "this is from $bhe she it";
php并没有对unicode做底层支持,所以处理多字节字符要使用
mb_*方法运算符
php运算符和javascript类似,但也有和别处不同地方
.并置,用于连接两个字符串,扩展的有.=and or xor与,或,异或,用于逻辑运算;and &&相同,or ||相同<>不相等,和!=相同<=>组合比较,大于返回1,等于返回0,小于返回-1-
数组
数组是php中用一个变量存储多个值的类型,使用
array()创建,分为数值数组和关联数组, 数值数组:键的值从0开始自动分配的数组,对应js中普通意义上的数组
<?php$arr = array('this', 'is', 'normal');echo $arr[0];echo $arr[1];echo $arr[2]; // thisisnormal?>
关联数组:手动分配键的数组,符合js中对象的定义
<?php$arr = array('a'=>'this', 'b'=>'is', 'c'=>'normal');echo $arr['a'];echo $arr['b'];echo $arr['c'];echo count($arr);// thisisnormal3?>
使用
count()获取数组长度sort()对数组升序排序,在前面添加其他词可以额外定制
超级全局变量
超级全局变量全局可用,不需要特殊的说明
$GLOBALS存储了所有全局变量的数组$_SERVER由web服务器创建,包含名称,路径,头信息,脚本位置等信息$_REQUEST收集表单提交的数据 ```php
<?php $name = $_REQUEST[‘fname’]; echo $name; ?>
4. `$_POST``$_GET`用于post和get请求4. 其他`$_FILES``$_ENV``$_COOKIE``$_SESSION`<a name="lXLaj"></a>### foreach针对数组的循环,可以输出key和value```phpforeach ($arr as $value) {print_r($value);}foreach ($arr as $key=>$value) {print_r($key);print_r($value);}
魔术常量
php中预定义了大量的魔术常量,可以获取当前环境的一些元信息
__LINE__当前行__FILE__当前绝对路径文件名__DIR__当前绝对路径文件夹__FUNCTION__函数名称__CLASS__类型名称__TRAIT__复用?不太懂__METHOD__类的方法名__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(); ?>
<a name="cA1Qp"></a>### 名词空间名词空间和c++类似,有以下知识点:1. namespace除了定义源文件编码方式的`declare()`语句不能有其他代码1. namespace可以不加括号,下面的代码在该名词空间中直到遇到下一个名词空间```php<?phpdeclare(encoding='UTF-8');namespace f;$a = 1;echo $a;namespace wp_publish_once;$a = 2;echo $a;?>
- namespace加括号,全局代码必须在
namespace{}中 - 支持子空间
father/son - 可以通过
namespace/foo()访问全局变量中的foo()函数 - 使用
__NAMESPACE__可以得到当前名词空间名称,全局为"" - 导入命名空间
use,设置别名use as - 导入的命名空间由上到下有顺序性
- 命名空间内部访问全局同名变量的方法,添加
\```php namespace { function e() {
} }echo 'outer';
namespace { function f() { echo ‘inner’; \e(); } f(); }
<a name="YHRFG"></a>### 类1. 类使用`public, protected, private`声明变量和函数,还可以用`var/public`声明变量1. `const`声明常量不需要使用`$`,类外面使用`class_name::const_name`的形式访问`const``static`,还可以使用使用`instance_name::static_name`访问`static`变量1. php类中使用`self::const_name`访问`const`常量和`static`变量,使用`$this->var_name`(no $)访问变量1. 抽象方法必须在抽象类中1. 静态变量`static`可以不实例化访问1. 类的`final`不可被继承,方法,变量的`final`不可悲=被子类覆盖1. 子类构造函数**不自动**调用父类的构造函数,使用`parent::__construct()`手动调用```phpclass sub extends Animal {function __construct(){class sub extends Animal {function __construct(){parent::__construct();}});}}
switch
switch在比较的时候的逻辑是==
$a = '4';switch ($a) {case 4:echo 'got'; // 匹配case '4':echo 'get'; // 匹配case 5:echo 'g';default:break;}
日期和时间
将变量转化为整数值
array_push($arr, $val1, $val2)
将一个或多个单元压入数组末尾
implode($separator, $arr)
Wordpress
1. bloginfo($name)
获取信息博客的相关信息,如site name,tag name等
2. single.php
wordpress在用户访问某个博客的the_permalink()的时候,优先寻找single.php作为模版,如果不存在就使用默认的index.phppage.php同理header.php可以使用get_header()加载footer.php可以使用get_footer()加载
3. add_action
在指定的action上挂载一个函数,这个函数会在do_action的时候触发
4. wp_head
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()迭代时是否有还有postthe_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()获取当前页面的IDwp_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列表
wp_list_pages(array(/** 是否显示标题行 */'title_li' => NULL,/** 显示父页面/本页面的子菜单 */'child_of' => $findChildrenOf,/** 默认按照字母排序,这里根据设置的order排序 */'sort-column' => 'menu_order'));
17. header和body相关的函数
language_attributes()检测浏览器语言并输出,可以在html tag中输出语言设置bloginfo('charset')检测博客语言并输出,可以设置meta charsetbody_class()输出当前body使用的class,可以得到当前页面相关的信息
18. menu注册菜单,添加菜单
register_nav_menu($name, $description)在after_setup_theme的钩子函数中可以注册菜单名称wp_nav_menu($arr)可以在wp-admin中Appearence/Menu菜单中设置好后使用这个函数在HTML中使用这个函数显示菜单
wp_nav_menu(array('theme_location' => 'footerLocationOne'));
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)
注册一个自定义类型,可以自定义一些行为如文本等
register_post_type('event', array(/** 直接添加以下功能 */'supports' => array('title', 'editor', 'excerpt'),'rewrite' => array(/** 将url中的event重写成events */'slug' => 'events'),/** 这个自定义类型支持分类 */'has_archive' => true,'public' => true,// 使用现代编辑器'show_in_rest' => true,'labels' => array('name' => 'Events','add_new_item' => 'Add New Event','edit_item' => 'Edit Event','all_items' => 'All Event','singular_name' => 'Event'),'menu_icon' => 'dashicons-calendar'));
如果使用rewrite重写了slug,在浏览器的固定链接中则只能使用events,所以在导航到新链接的时候不能硬编码site_url('/events')。可以使用get_post_type_archive_link('event')
26. 全局触发的插件
在wp-content/mu-plugins下的插件直接运行且在仪表盘页面无法修改。
27. 摘要excerpt
摘要在新注册的type中使用supports来增加
register_post_type('event', array('supports' => array('excerpt'),));
`has_excerpt()`判断是否拥有摘要<br />`get_the_excerpt(), the_excerpt()`摘要内容
28. 自定义字段ACF
the_field($key)根据key查value并显示get_field($key)返回value
自定义字段的查询实例,以查询没有过期的最近的event为例
$today = date('Ymd');$homepageEvents = new WP_Query(array(/** -1代表返回所有参数 */'posts_per_page' => -1,'post_type' => 'event',/** 查询的key */'meta_key' => 'event_date',/** 按照值(_num表示这是数字)排序 */'orderby' => 'meta_value_num',/** ASC正序,DESC倒叙 */'order' => 'ASC',/** meta相关的查询条件,很语义化:event_date >= today, 比较的方式是数字 */'meta_query' => array(array('key' => 'event_date','compare' => '>=','value' => $today,'type' => 'numeric'))));
29. 修改默认的查询
修改默认的基于URL的查询query,在add_action('pre_get_posts', $func_name);中修改,使用$query->set('meta_key', $key_name)全局修改查询的条件。
function university_adjust_query($query) {if(!is_admin() AND is_post_type_archive('event') AND $query->is_main_query()) {$today = date('Ymd');$query->set('meta_key', 'event_date');$query->set('orderby', 'meta_value_num');$query->set('order', 'ASC');$query->set('meta_query', array(array('key'=>'event_date','compare'=>'>=','value'=>$today,'type'=>'numeric')));}}add_action('pre_get_posts', 'university_adjust_query');
`is_admin`判断是否是仪表盘界面<br />`is_post_type_archive($post_type)`判断post的类型,可以是Custom Field<br />`is_main_query()`可以判断query是否是默认基于URL的query
30. 自定义查询的分页
在WP_Query中添加paged表明当前查询所在的分页。get_query_var('paged', $default)在WP_Query中检索查询到的变量的值,可选添加默认值paginate_links(array('total'=>$query->max_num_pages))分页的组件,只支持默认的query,自定义的query需要total和paged。
$today = date('Ymd');$pastEvents = new WP_Query(array('paged' => get_query_var('paged', 1),'post_type' => 'event','meta_key' => 'event_date','orderby' => 'meta_value_num','order' => 'ASC','meta_query' => array(array('key' => 'event_date','compare' => '<','value' => $today,'type' => 'numerical'))));echo paginate_links(array('total' => $pastEvents->max_num_pages));
31. 关联两个不同类型的post
Custom Field的Filed Type选择**Relationship**
获取关联的post:通过get_field($field)获取关联的$post类型的数组,
获取被关联的post:WP_Query通过$filed进行meta_query查询,ID需要字符串查找
'meta_query' => array(array('key' => 'related_programs','compare' => 'LIKE','value' => '"' . get_the_ID() . '"'))
