- 变量
- 基本属性
- 作用域
- 类型比较
- 常量
- 字符串
- 运算符
- 数组
- 超级全局变量
- 魔术常量
- 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已被弃用)
<?php
function greeting() {
define('jay', 'jay');
}
greeting();
echo jay, ' defined in function'; // 输出jay defined in function
?>
字符串
php字符串单双引号有差别
- 单引号优先级高,不会解析变量
- 双引号优先级低,会解析变量
<?php
$a = 2;
echo '单引号优先级高,不会解析变量 $a。';
echo "双引号优先级低,会解析变量$a";
?>
使用
.
连接字符串<?php
echo '使用.'.'连接字符串';
?>
strlen
获取字符串字节长度(中文3字节,英文1字节?)<?php
echo 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 from
he she it
EA;
echo $a;
/*
this is from
he she it
*/
- heredoc语法
heredoc语法和双引号行为一致,语法是<<<T T
,和nowdoc的不同是第一个T没有单引号。
使用双引号同样能达到效果
$b = 2;
$a = <<<EA
this is from $b
he she it
EA;
echo $a;
$c = "
this is from $b
he 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
```php
foreach ($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
<?php
declare(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()`手动调用
```php
class 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.php
page.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() . '"'
)
)