关于method_exists的信息
本文目录一览:
- 1、用ABAP语言实现查询一个文档在一个路径下是否存在
- 2、no more simqle什么意思
- 3、java中Servlet上传文件到服务器指定目录,报路径不存在的错误,我QQ,394576483
- 4、触动精灵怎么复制文本里指定的一段文字?
- 5、laravel 怎么检测队列是否执行
- 6、JAVA 如何一次下载多个文件
用ABAP语言实现查询一个文档在一个路径下是否存在
用下面的代码,lf_file里传入文件的绝对路径,如果文件不存在,exceptiONs和result会返回对应的提示信息,代码如下:
CALL METHOD cl_gui_frontend_services=file_exist
EXPORTING
file = lf_file
RECEIVING
result = lf_file_exists
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc = 0 AND lf_file_exists IS INITIAL.
MESSAGE e398(00) WITH '文件不存在' '' '' '' .
ENDIF.
no more simqle什么意思
没有这个单词”simqle“,正确的拼写是”simple“。
no more simple
不再简单
例句:
1.No more simple ding to indicate the arrival of an e-mail regardless of recipient, sender, or subject.
不再是仅播放ding这样简单的声音来表示您收到了邮件,而不管它的收件人和发件人以及主题是什么。
2.Comparing with DMO in constant velocity, DMO in any V ( z) is more close to real geologic condition, its pulse response is no more simple “ SMILE ” ellipse and difficult express in analytic expression in a condition of velocity field.
石油地球物理勘探,2001,36(6):665~671本文在对常速频域DMO和倾角分解DMO进行分析的基础上,对任意V(z)DMO进行了初步探讨。与常速DMO相比,任意V(z)DMO更接近实际地质情况,其脉冲响应不再是简单的SMILE椭圆,依据速度场情况,其响应很难用解析式表达。
3.As I watch Europe 's leaders stumbling through the debt crisis I am increasingly persuaded that this is no more than a simple description of present reality.
看到欧洲领导人在债务危机中磕磕绊绊的样子,我越来越相信,这就是对当前现实的一种描述。
java中Servlet上传文件到服务器指定目录,报路径不存在的错误,我QQ,394576483
可以在程序中判断一下该目录是否存在,如果不存在,创建目录。
File f = new File("D:\\apache-tomcat-6.0.20\\webapps\\up1\\WEB-INFO\\files");
if(!f.exists()){
f.mkdirs();
}
另外,你这个路径不太好,如果你的war包部署在tomcat上,是没有解开成一个目录,那文件上传肯定会失败。 建议你换一个实际存在的目录,用来存放文件。
触动精灵怎么复制文本里指定的一段文字?
触动精灵脚本开发手册
目录
前言
学习前的准备
越狱及 root 常识
Lua 基础简明教程
脚本开发取色技巧
小白学触动零基础视频教程
触动精灵开发者指南
触动产品功能对比
如何查看更多文档
脚本开发相关工具
触动精灵 iOS
脚本编辑器:TouchSprite Studio
抓色器:TSColorPicker
已兼容的模拟器
点击触摸
函数:touchDown、touchUp、touchMove 触摸点击、滑动
函数:catchTouchPoint 获取用户点击坐标
图色类及屏幕相关
函数:init 初始化
函数:getDeviceOrient 获取手机、应用屏幕方向(仅支持 iOS)
函数:setDeviceOrient 设置屏幕方向(仅支持 iOS)
函数:getScreenSize 获取屏幕分辨率
函数:setScreenScale 坐标缩放
函数:keepScreen 保持屏幕
函数:getColor、getColorRGB 获取屏幕某点颜色值
函数:findColorInRegionFuzzy 区域模糊找色
函数:findImageInRegionFuzzy 区域模糊找图
函数:findMultiColorInRegionFuzzy 区域多点找色
函数:findMultiColorInRegionFuzzyExt 高级区域多点找色
函数:findImage 高级区域找图(仅支持 iOS)
函数:snapshot 截图
函数:imageOperMerge 图片合并(仅支持 iOS)
开发辅助类
函数:initLog、wLog、closeLog 日志函数
函数:sysLog 系统日志
函数:nLog 远程日志
脚本控制
函数:mSleep 延时
函数:lua_exit 退出脚本
函数:lua_restart 重载脚本
函数:luaExitIfCall 来电暂停
函数:checkScriptAuth 脚本授权
系统相关
函数:dialog 提示框
函数:toast 提示
函数:dialogRet 带按钮的对话框
函数:dialogInput 参数对话框(仅支持 iOS)
函数:getNetTime 获取网络时间
函数:addContactToAB 添加联系人
函数:removeAllContactsFromAB 清空通讯录
UTF-8 编码
模块说明
函数:utf8.char 整数序列转换字符串
函数:utf8.codes 获取字符编码
函数:utf8.codepoint 获取指定位置字符编码
函数:utf8.len 统计字符个数
函数:utf8.offset 获取字符位置
文字输入及按键模拟
函数:inputText 输入字符串
函数:switchTSInputMethod 切换到触动/帮你玩输入法(仅支持 Android)
函数:getInPutMethod 获取当前输入法包名(仅支持 Android)
函数:pressHomeKey 模拟主屏幕按键
函数:doublePressHomeKey 双击 HOME 键(仅支持 iOS)
函数:keyDown、keyUp 模拟键盘(仅支持 iOS)
应用相关
函数:runApp、closeApp 运行、关闭应用
函数:isFrontApp 判断前台应用
函数:frontAppBid 获取前台应用
函数:appBundlePath 获取应用安装路径
函数:appDataPath 获取应用数据路径(仅支持 iOS)
函数:appIsRunning 检测应用是否运行
函数:openURL 打开网络地址
函数:ipaInstall、ipaUninstall 安装、卸载应用(仅支持 iOS)
函数:install, uninstallApp 安装、卸载应用程序(仅支持 Android)
函数:getInstalledApps 获取应用列表
函数:isInstalledApk 查询应用程序是否安装(仅支持 Android)
函数:changeSpeed 变速器(仅支持 iOS)
函数:cleanApp 清理应用数据(仅支持 Android)
系统信息类
函数:getDeviceType 获取设备类型
函数:getDeviceID 获取触动精灵设备号
函数:getMemoryInfo 获取设备内存信息
函数:getTSVer、getOSVer 获取引擎版本号、获取系统版本号
函数:getOSType 获取设备系统
函数:batteryStatus 检测电池状态、电量
函数:getProcess 获取设备进程列表
函数:getDeviceAlias 获取设备别名(仅支持 iOS 企业版)
函数:getDeviceName 获取设备名称
函数:setDeviceName 设置设备名称(仅支持 iOS)
函数:getIMEI 获取设备 IMEI(仅支持 Android)
函数:getNetworkIP 获取网络 IP(仅支持 Android)
函数:getDeviceBrand 获取设备品牌(仅支持 Android)
函数:getDeviceModel 获取设备型号(仅支持 Android)
函数:getCPUType 获取 CPU 型号(仅支持 Android)
函数:getUUID 获取 UUID(仅支持 Android)
函数:getSDCardPath 获取 SD 卡路径(仅支持 Android)
函数:getDPI 获取屏幕 DPI 和像素密度(仅支持 Android)
系统控制
函数:setRotationLockEnable 锁定设备方向(仅支持 iOS)
函数:setWifiEnable 无线开关
函数:setBTEnable 蓝牙开关
函数:setAirplaneMode 飞行模式开关
函数:getStatus 获取状态
函数:setEnable 开关(仅支持 iOS)
函数:setCellularDataEnable 蜂窝网络开关(仅支持 iOS)
函数:setAssistiveTouchEnable 小圆点开关(仅支持 iOS)
函数:setReduceMotionEnable 减弱动效开关(仅支持 iOS)
函数:getBacklightLevel 获取屏幕亮度触动精灵复制文本里指定的一段文字
函数:setBacklightLevel 设置屏幕亮度
函数:setVolumeLevel 设置设备音量
函数:vibrator 手机振动
函数:playAudiostopAudio 播放音频、停止播放
函数:lockDevice 锁定设备
函数:deviceIsLock 设备锁定状态
函数:unlockDevice 解锁设备
函数:setAutoLockTime 设置锁屏时间
函数:resetIDLETimer 重置锁屏计时(仅支持 iOS)
函数:shakeDevice 摇一摇(仅支持 iOS)
函数:setScreenResolution 修改分辨率(仅支持 iOS)
函数:clearKeyChain 清除钥匙串(仅支持 iOS)
函数:fakeGPS 伪装位置(仅支持 iOS)
函数:saveImageToAlbum 图片存入相册
函数:saveVideoToAlbum 视频存入相册(仅支持 iOS)
函数:writePasteboard、readPasteboard 读写剪贴板
回调函数
函数:beforeUserExit 终止之前运行
文字识别
函数:ocrText 本地光学字符识别
函数:addTSOcrDict、addTSOcrDictEx、tsOcrText、tsFindText 触动点阵识别
函数:addDmOcrDict、dmOcrText、dmFindText 打码点阵识别
触动相关
函数:deviceIsAuth 获取触动精灵授权状态(仅支持 iOS)
函数:getRunningAccess 获取当前脚本运行权限(仅支持 Android)
函数:userPath 获取客户端文件路径
函数:whoAmI 检测触动产品类型
函数:showFloatButton 显示、隐藏悬浮条
Thread 协程(仅支持 iOS)
函数:thread.create 创建协程
函数:thread.createSubThread 创建子协程
函数:thread.stop 停止协程队列
函数:thread.wait 阻塞等待当前协程完成
函数:thread.setTimeout 设置协程超时时间
函数:thread.clearTimeout 清除协程超时时间
函数:thread.waitAllThreadExit 协程阻塞等待
浮动窗口
函数:fwShowWnd 显示浮动窗口
函数:fwShowTextView 显示文字视图
函数:fwShowImageView 显示图形视图
函数:fwCloseView 关闭视图
函数:fwCloseWnd 关闭窗口
函数:fwGetWndPos 获取窗口位置
函数:fwShowButton 显示一个按钮
函数:fwGetPressedButton 获取按钮点击事件
完整实例
showUI 脚本 UI
什么是 json
调用示例
用 json 创建界面
全局属性
style 界面样式
width、height 界面的宽和高
bg 指定界面的背景图片
okname、cancelname 指定底部按钮显示文字
title 界面标题
pagetype 开启多页显示模式
orient 指定 UI 界面显示方向
btnbkcolor 设置底部按钮背景色
pagenumtype 设置分页指示样式
bgcolor 设置界面背景色
config 指定UI配置保存文件名
timer 指定UI界面自动确认时间
rettype 指定返回值类型
selpage 多页模式下指定默认停留的页面
通用属性
width 控件宽度
nowrap 指定下一个控件是否换行
界面控件
标签 Label
单选框 RadioGroup
编辑框 Edit
多选框 CheckBoxGroup
下拉框 ComboBox
图片 Image
默认样式
指定控件尺寸与位置
返回值
自定义样式实例代码
webUI(仅支持 iOS)
webview.new 创建 webview
myweb1.show 显示webview
myweb1.set 改变 webview 外观
myweb1.close 关闭 webview
event.register 发送消息,传递参数
完整例子
触动精灵模拟物理按键(仅支持 Android)
为触动增加无限可能,Lua扩展库
触动精灵 TSLib 函数扩展库
函数扩展库下载
点击滑动类
颜色判断类
开发调试类
文件操作类
应用信息类
数据操作类
系统判断类
clear 清理类模块
showUI 脚本配置界面
便捷UI
触动精灵云打码扩展库
触动精灵云打码
使用方法
函数:ocr.cloudOcrText、ocr.cloudOcrReportError、ocr.version
简易 SMTP 邮件发送库
函数:mail.send
触动精灵中 "os.execute" 应用
respring 注销
poweroff 关机
reboot 重启
clearCache 清空缓存
delFile 删除文件
unzip 解压
movefile 移动文件
copyfile 复制文件
newfolder 创建文件夹
触动精灵中"io库"应用
readFile 将指定文件中的内容按行读取
getList 遍历文件
findFile 查找文件
file_exists 检测指定文件是否存在
在触动精灵中使用"LuaSocket"网络库
如何安装
httpGet请求
httpPost请求
挂载代理
以 socket 的方式访问
smtp方法发送 mail
实现获取网络时间
统计毫秒精度的时间
生成随机数
触动精灵ts.so扩展库
触动精灵苏泽扩展库
JSON 模块
FTP 模块
设备信息模块
字符串处理模块(仅支持 iOS)
HTTP 模块
PLIST 文件操作(仅支持 iOS)
POS 模块
附录
iOS 设备分辨率一览表
Lua math 库
已知与触动精灵/帮你玩/小精灵/企业版 iOS 冲突的插件列表
约定的按键编码
电话功能按键
控制类按键
基本类按键
安卓手机如何开启系统悬浮窗权限
laravel 怎么检测队列是否执行
队列Service
laravel把队列相关的服务全封装在一个Service里面,通过Queue Service Provider 注册到IOC中.在Queue Serivce里提供了多种服务,关于它做了什么请看以下代码中的注释(代码有点多,就不全部贴出来了)
public function register()
{
// 注册Manager, 而Manager为队列服务的统一入口
$this-registerManager();
// 注册队列的各种命令
$this-registerWorker();
$this-registerListener();
// 注册任务执行失败后的记录
$this-registerFailedJobServices();
// 未知
$this-registerQueueClosure();
}
讲配置文件
在Queue Service注入到IOC后,我们就可以使用队列了。
一个队列服务最基本的就是把任务写入队列,再将其拿出来执行, 很简单.所以队列服务最基本的要素有四点:任务,进队列,出队列,执行.在这里,我们就跟着这四个要素的步伐,看看它们在laravel中是如何实现的.这里,先以官方的示例来分析,有了一个具体概念之后再举一反三,学会它的本质。
任务
队列服务就是围绕着任务进行的.在手册上,通过它的实例SendReminderEmail,我们可以很清楚地知道,laravel可以对一个任务做很多事,比如:可设置重新执行的次数,说明该任务(若失败)可以被执多次(针对的是单个Job);可设置是否可以延迟执行;对该Job设置处理的队列名称,等等.这些功能都是\Illuminate\Bus\Queueable提供的,当然,实例中还有一个\Illuminate\Queue\InteractsWithQueue,而它则是针对Job所用(稍后再说).一个任务建立完成后,就需要使其进入队列了。当然了,除了以上几个特点,还有任务的执行逻辑等等,要全面地了解任务,就需要清楚它的数据结构,其在队列中的数据结构会在进入队列中讲到.
任务进队列
示例中,在定义了任务之后,就将其用Controller中的方法使其进入了队列,那么这一点是如何实现的?
代码在:\Illuminate\Foundation\Bus\DispatchesJobs
protected function dispatch($job)
{
return app(Dispatcher::class)-dispatch($job);
}
/**
* Dispatch a command to its appropriate handler in the current process.
*
* @param mixed $job
* @return mixed
*/
public function dispatchNow($job)
{
return app(Dispatcher::class)-dispatchNow($job);
}
这段代码的意图得了解app(Dispather::class), 这个则在\Illuminate\Bus\BusServiceProvider中表现的很明确了(为什么是这里就不分析了),app(Dispather::class)就是\Illuminate\Bus\Dispatcher.现在,上面代码中的dispatch与 dispatchNow方法就会逐渐清晰起来.简言之,该Dispatcher类做了两件事,执行该任务或把该任务放入队列,也就是将队列任务分为了两种执行方式,立即执行或以消息队列执行,与队列相关的代码如下:
/**
* 把任务分发到队列中
* @param string $command 任务类
*/
public function dispatchToQueue($command)
{
$connection = isset($command-connection) ? $command-connection : null;
// laravel里内置了多种队列服务,这里则解析出来
$queue = call_user_func($this-queueResolver, $connection);
// 队列服务解析不成功则抛出异常
if (! $queue instanceof Queue) {
throw new RuntimeException('Queue resolver did not return a Queue implementation.');
}
// 在任务类中可自定义queue方法进入队列
if (method_exists($command, 'queue')) {
return $command-queue($queue, $command);
} else {
// 系统提供的一种进入队列方式
return $this-pushCommandToQueue($queue, $command);
}
}
/**
* 根据不同的任务属性选择不同的进入队列方式
* 这里所提到的方式在手册中有提到
* @param Queue $queue 队列服务
* @param $command 任务类
*/
protected function pushCommandToQueue($queue, $command)
{
// 该推任务设置了延迟,且设置队列名称
if (isset($command-queue, $command-delay)) {
return $queue-laterOn($command-queue, $command-delay, $command);
}
//设置队列名称
if (isset($command-queue)) {
return $queue-pushOn($command-queue, $command);
}
//设置延迟
if (isset($command-delay)) {
return $queue-later($command-delay, $command);
}
// default
return $queue-push($command);
}
到现在为止,Controller已经展示了一种进入队列的方法,很明显它是经过封装提供的接口,虽然很好用,但有些操作是我们所不必须的,比如:是否立即执行,进入队列就需设置不同的任务参数等等,需要更好的为我们所用,就再深入一点,找出它进入队列的关键点(与Redis交互的地方).上面已经提到call_user_func($this-queueResolver, $connection);会得到一个队列服务,那么$this-queueResolver是什么?在\Illuminate\Bus\BusServiceProvider:23就可以看到:
// 理解这个回调,则需要了解Illuminate\Contracts\Queue\Factory
// 在vendor/laravel/framework/src/Illuminate/Foundation/Application.php:1051 可以看到它与Illuminate\Queue\QueueManager的关系了
$this-app-singleton('Illuminate\Bus\Dispatcher', function ($app) {
return new Dispatcher($app, function ($connection = null) use ($app) {
return $app['Illuminate\Contracts\Queue\Factory']-connection($connection);
});
});
QueueManager
在laravel中,Service对外的统一接口都是其Manager,其中与所需服务交互的基本上是通过__call 方法提供,这种方式有两个优点,一,提供统一的接口,二,分层明确(将实际的处理由__call转发,与配置相关的则由manager自己解决).
现在为了使任务进入队列的过程更清晰,一步一步找到了QueueManager,这个类设置了很多事件接口,和其他连接相关方法.其中connection方法就展示了一个队列服务是如何解析出来的了.
其实这段解析的代码唯一的难点中于:
protected function getConnector($driver)
{
if (isset($this-connectors[$driver])) {
return call_user_func($this-connectors[$driver]);
}
throw new InvalidArgumentException("No connector for [$driver]");
}
为什么这么一段简单的代码就能解析队列服务?查看QueueServiceProvider就一目了然了.其中就注册了很多队列服务.redis的队列服务处理则是\Illuminate\Queue\RedisQueue.
QueueManager的功能现在很清晰了.1,解析队列服务 2,转发(__call)处理到相应的队列服务中 3,提供队列相关接口 .既然QueueManager有这么多队列相关的功能,那么我们完全可以把它作为一个队列处理的入口(直接获取队列服务再进行操作是并不是明智的选择),巧的是laravel也是这么做的.所以现在有两种方式进入队列,1,使用\Illuminate\Foundation\Bus\DispatchesJobs间接与队列服务通信 2,使用QueueManager间接与队列服务通信.当然这些方法都是在\Illuminate\Queue\RedisQueue(队列服务的接口)上扩展的.所以掌握该类,就能明白队列的各种行为了.
RedisQueue
队列服务在lavavel中提供了多种,这里只对以Redis队列服务进行分析学习.所以有关队列的处理都集中在\Illuminate\Queue\RedisQueue.上面也说到了,有两种方式进入队列, 分别使用,看它们产生的任务数据结构有什么区别?(数据结构便于分析,在后面会提到)
在Controller使用 $this-dispatch((new SendReminderEmail()));即以任务类进入
{
"job": "Illuminate\\Queue\\CallQueuedHandler@call",
"data": {
"command": "O:26:\"App\\Jobs\\SendReminderEmail\":4:{s:5:\"queue\";s:5:\"email\";s:10:\"connection\";N;s:5:\"delay \";N;s:6:\"\u0000*\u0000job\";N;}"
},
"id": "7u00jImd8CAns0fQO8jedqkQmnbQsfsr",
"attempts": 1
}
直接使用 Queue::push(SendReminderEmail::class , ['email'='123456789@qq.com'],'email');
{
"job": "App\\Jobs\\SendReminderEmail",
"data": {
"email": "123456789@qq.com"
},
"id": "I0OeBIQjJjisQrZ7STX3zexrBLF7Uilx",
"attempts": 1
}
上面讲到,构成消息队列需要两个进程,所以上面的进入队列是一个进程,现在的出队列及执行任务则在另一个进程中执行。lavarel提供了两个命令来启动该进程,quque:work ,queue:litsen 当然,再理解了如何完成这些操作后完全可以自己写一个命令,现在看看它是如何出队列和如何执行任务?
任务出队列
在手册中,对于一个任务可以指定多种属性,比如,延迟,失败次数,队列名称等等,当然,所有可执行操作或功能都得依赖数据结构,数据结构的制定也是为了实现相应的行为.所以,RedisQueue的代码对应上面的数据结构来理解就比较容易了。
RedisQueue是所有队列服务(Redis)的基础接口,所以任务出队列的操作也能在这找到。假设现在已经对RedisQueue的代码已经有点熟悉了,不难发现,有一个稍复杂的pop方法(出队列)。那么,问题出现了,出队列是如何实现的?解决了这个问题,任务出队列就可算是完成了.
队列应有的功能
查看php artisan queue:work --help命令的使用方法,整理有关队列所需的功能或服务:
指定队列名称
任务的执行逻辑
任务执行延迟
任务中失败的最大次数
当然还有其他关于该命令的功能,比如:是否以守护进程执行,是否强制执行,限制进程执行的memory,无任务时的等待时间.这些与命令相关的因不同的命令而异,与队列任务无关.这样,在理清队列任务需要的功能后,我们就可以分析它的数据结构,理解代码了.
队列数据结构
数据结构都是依据行为而建立.所以在查看pop方法时,可考虑以上几个点.上面的数据结构中,已经可以看到队列的执行逻辑,所需参数,失败次数,这些一目了然,就不啰嗦了.在整个pop方法中,有这么几个队列,queue:delayed,queue:reserved,queue.本来取出一个任务用lpop就可完成,为什么要多用两个集合(注意,是有序集合不是队列)来完成pop操作呢?因为要实现任务延迟和失败处理.
其执行过程如图:
过程解析:
(1). 取任务,因为要实现延迟的功能,所以在有序集合里的score是过期时间,过期时间的含义则是在此时间之前不执行,也就达到了延迟执行的效果.延迟的含义在这里指的并不是在多少秒后执行,而是在多少秒内不执行.对于过期的任务,就将其rpush到队列中,直到lpop操作将其拿走.
(1).为什么在存在queue:reserved集合并且把lpop的任务zadd进支?因为只要lpop了job就可以将其记录下来,若此时任务还未开始执行进程就非正常终止了,该任务就不会丢失,再次执行时,依据上面的步骤就可以将其取出,防止意外使job丢失.
(2).队列的执行都是依据json中的类来完成,这部分较简单,略.
(3).当任务执行成功时,要手动删除queue:reserved中的任务;当任务执行失败,删除queue:reserved中的任务,再将其记录下来,记录方式是zadd queue:delayed, 并且将该任务的执行次数加一,这个过程RedisQueue已经封装(RedisQueue::release)好了.
这一系列的过程就完成了让队列任务延迟的功能.所以这么复杂的操作都是为了实现延迟的功能,当然,有更好的点子可以考虑自己实现.
执行任务
到此,任务的执行在json数据结构中表现的很明确,整个处理过程也很清晰了.需要注意的是当任务执行成功后要删除任务.对于如何执行出队列,以及如何执行队列任务,可以详细看看queue:work命令(\Illuminate\Queue\Console\WorkCommand::fire), 它是最好的示例;
队列处理命令的自定义
在使用queue:work之后,会发现它并不有处理所有的情况.所以在本文中一直提到过,自写一个处理命令是可行的.当面临queue:work所不能解决的问题时,可以好好考虑下自己编写.在实际开发中,任务的种类繁多,对于不同的任务应该有不同的处理方案.所以,有以下几个问题是经常遇到的:
比如:
调用服务发生错误且由服务提供方造成,需另作记录,而这样的错误不算作job的执行错误
营销短信只能在9:00到20:00之间发送, 所以在该时间段内没有执行的必要
与数据库交互时,数据库连接是有时间限制的,而以守护进程的方式执行则无时间限制,这样就会报错
所以,面临laravel所提供命令的局限性,有自定义处理命令的能力是很有必要的.
JAVA 如何一次下载多个文件
创建多线程下载
如果说方便下载,是打包再下载
~~~~~~~~~~~~~~~~~~~~~~
method_exists的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、method_exists的信息别忘了在万域城进行查找喔。
相关文章
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~