王新阳

wangxinyang

PHP try...catch无效的原因及解决办法

来源:百度文心一言

在PHP中,try-catch块主要用于捕获和处理异常(Exceptions),而不是用于捕获和处理警告(Warnings)或通知(Notices)。警告和通知是PHP的错误报告机制的一部分,它们指示代码中存在潜在的问题,但通常不会阻止脚本的执行。

如果你的PHP代码中的try-catch块看起来没有按预期工作,并且直接显示了警告(Warning),这通常意味着:

1. 抛出的不是异常:你的代码可能在try块中产生了警告,而不是抛出了一个异常。警告不会自动被catch块捕获。

2. 异常未被正确抛出:如果你预期某个函数或操作会抛出异常,但实际上它没有抛出(可能因为某些条件未满足),那么catch块也不会捕获任何内容。

解决方案

1. 检查错误类型:
确保在try块中发生的是异常(Exception)而不是警告(Warning)或通知(Notice)。
如果你想处理警告或通知,你可能需要调整PHP的错误报告级别,或者使用其他机制(如错误处理函数set_error_handler())来捕获这些错误。

2. 正确抛出异常:
确保在try块中的代码在遇到问题时能够抛出异常。
如果你的代码依赖于第三方库或框架中的函数来抛出异常,请确保该函数在失败时确实会抛出异常。

3. 使用错误处理函数:
如果需要捕获警告或通知,你可以使用set_error_handler()函数来设置一个自定义的错误处理函数。这个函数可以捕获错误,并可以根据需要抛出异常。

set_error_handler(function($severity, $message, $file, $line) {  
	if (!(error_reporting() & $severity)){  
		// This error code is not included in error_reporting  
		return;  
	}  
	throw new ErrorException($message, 0, $severity, $file, $line);  
});  
$arr=array('a');
try{  
	trim($arr);
}catch(Exception $e) {  
	echo var_export($e,true);
	echo $e->getMessage(), $e->getFile();
}	

4. 检查PHP错误报告设置:确保你的PHP配置(php.ini)或运行时配置中的错误报告设置符合你的需求。你可以通过error_reporting()函数来动态调整错误报告级别。


获取微信公众号关注地址

来源:https://blog.csdn.net/weixin_42645230/article/details/114372624
第一步:将微信公众号的任意一篇推文链接复制出来,在浏览器中打开

第二步: 按住F12(window系统)打开代码审查 ,将代码全部复制出来放到一个新建的txt文件,全局搜索__biz,将后面跟的参数复制下来

第三步:将第二步获取的__biz参数放到下面位置 ,该链接即为关注页面的链接  本文发布于 2021-03-04 亲测有效

https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=这里第二步拿到的参数&scene=110#wechat_redirect

使用下面链接也可以: 20240717测试有效
https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=参数#wechat_redirect

用jQuery对html转义字符进行反转义

$('<div></div>').html(转义后的html).text();

阿塔卡马沙漠

解决 Kindle 导入电子书封面显示为"暂无图片"的问题

KINDLE相关问题这上面都有:https://bookfere.com/buy


转自:https://zhuanlan.zhihu.com/p/570024330

方法一:

下载电子书后使用Calibre软件打开,选中电子书右键发送到Kindle设备,封面就有了,结束!
使用这种方式都不用关闭Kindle的飞行模式来联网下载封面,如果没有Kindle要求的Azw3格式的电子书的话,使用Calibre的Convert books还能随意转换电子书格式。

方法二:

用数据线连接电脑与Kindle,打开Kindle磁盘 Windows与macOS是差不多的,把书籍拖入documents文件夹中后将Kindle与电脑断开连接,建议下载azw3格式的电子书。

这时打开Kindle就能看到新导入的书了,将Kindle连接Wi-Fi后会自动下载书籍封面,因为导入的书在亚马逊书城中不存在,就会显示一张暂无图片的默认封面。

这时再将Kindle与电脑连接,打开隐藏文件夹System后打开thumbnails文件夹,这里是存放电子书的封面文件夹,看到一张 暂无图片文字 的图片,复制此文件名称后删除此图片,将下载好的电子书封面图片拖进来重命名为刚刚复制好的名称就好了。

这时断开Kindle与电脑的连接,打开Kindle就能看到电子书的封面就是自己刚刚替换掉的那张了

datetimepicker手册

来源:
https://xdsoft.net/jqplugins/datetimepicker/
https://github.com/xdan/datetimepicker

Full options list

NamedefaultDescrEx.
lazyInitfalseInitializing plugin occurs only when the user interacts. Greatly accelerates plugin work with a large number of fields 
parentID'body'Attach datetimepicker to this element, which can be either a selector or a DOM/JQuery element
{parentID:'#parent'}
valuenullCurrent value datetimepicker. If it is set, ignored input.value
{value:'12.03.2013',
 format:'d.m.Y'}
langenLanguage i18n
ar - Arabic
az - Azerbaijanian (Azeri)
bg - Bulgarian
bs - Bosanski
ca - Català
ch - Simplified Chinese
cs - Čeština
da - Dansk
de - German
el - Ελληνικά
en - English
en-GB - English (British)
es - Spanish
et - "Eesti"
eu - Euskara
fa - Persian
fi - Finnish (Suomi)
fr - French
gl - Galego
he - Hebrew (עברית)
hr - Hrvatski
hu - Hungarian
id - Indonesian
it - Italian
ja - Japanese
ko - Korean (한국어)
kr - Korean
lt - Lithuanian (lietuvių)
lv - Latvian (Latviešu)
mk - Macedonian (Македонски)
mn - Mongolian (Монгол)
nl - Dutch
no - Norwegian
pl - Polish
pt - Portuguese
pt-BR - Português(Brasil)
ro - Romanian
ru - Russian
se - Swedish
sk - Slovenčina
sl - Slovenščina
sq - Albanian (Shqip)
sr - Serbian Cyrillic (Српски)
sr-YU - Serbian (Srpski)
sv - Svenska
th - Thai
tr - Turkish
uk - Ukrainian
vi - Vietnamese
zh - Simplified Chinese (简体中文)
zh-TW - Traditional Chinese (繁體中文)
$.datetimepicker.setLocale('ru');
formatY/m/d H:iFormat datetime. More Also there is a special type of «unixtime»
{format:'H'}
{format:'Y'}{format:'unixtime'}
formatDateY/m/dFormat date for minDate and maxDate
{formatDate:'d.m.Y'}
formatTimeH:iSimilarly, formatDate . But for minTime and maxTime
{formatTime:'H'}
step60Step time
{step:5}
closeOnDateSelect0 
{closeOnDateSelect:true}
closeOnWithoutClicktrue 
{ closeOnWithoutClick :false}
validateOnBlurtrueVerify datetime value from input, when losing focus. If value is not valid datetime, then to value inserts the current datetime
{ validateOnBlur:false}
timepickertrue 
{timepicker:false}
datepickertrue 
{datepicker:false}
weeksfalseShow week number
{weeks:true}
theme'default'Setting a color scheme. Now only supported default and dark theme
{theme:'dark'}
minDatefalse 
{minDate:0} // today
{minDate:'2013/12/03'}
{minDate:'-1970/01/02'} // yesterday
{minDate:'05.12.2013',formatDate:'d.m.Y'}
maxDatefalse 
{maxDate:0}
{maxDate:'2013/12/03'}
{maxDate:'+1970/01/02'} // tomorrow
{maxDate:'05.12.2013',formatDate:'d.m.Y'}
startDatefalsecalendar set date use starDate
{startDate:'1987/12/03'}
{startDate:new Date()}
{startDate:'+1970/01/02'} // tomorrow
{startDate:'08.12.1986',formatDate:'d.m.Y'}
defaultDatefalseif input value is empty, calendar set date use defaultDate
{defaultDate:'1987/12/03'}
{defaultDate:new Date()}
{defaultDate:'+1970/01/02'} // tomorrow
{defaultDate:'08.12.1986',formatDate:'d.m.Y'}
defaultTimefalseif input value is empty, timepicker set time use defaultTime
{defaultTime:'05:00'}
{defaultTime:'33-12',formatTime:'i-H'}
minTimefalse 
{minTime:0,}// now
{minTime:new Date()}
{minTime:'12:00'}
{minTime:'13:45:34',formatTime:'H:i:s'}
maxTimefalse 
{maxTime:0,}
{maxTime:'12:00'}
{maxTime:'13:45:34',formatTime:'H:i:s'}
allowTimes[] 
{allowTimes:[
  '09:00',
  '11:00',
  '12:00',
  '21:00'
]}
maskfalseUse mask for input. true - automatically generates a mask on the field 'format', Digit from 0 to 9, set the highest possible digit for the value. For example: the first digit of hours can not be greater than 2, and the first digit of the minutes can not be greater than 5
{mask:'9999/19/39',format:'Y/m/d'}
{mask:true,format:'Y/m/d'} // automatically generate a mask 9999/99/99
{mask:'29:59',format:'H:i'} //
{mask:true,format:'H:i'} //automatically generate a mask 99:99
openedfalse  
yearOffset0Year offset for Buddhist era 
inlinefalse  
todayButtontrueShow button "Go To Today" 
defaultSelecttrueHighlight the current date even if the input is empty 
allowBlankfalseAllow field to be empty even with the option validateOnBlur in true 
timepickerScrollbartrue  
onSelectDatefunction(){} 
onSelectDate:function(ct,$i){
  alert(ct.dateFormat('d/m/Y'))
}
onSelectTimefunction(current_time,$input){}  
onChangeMonthfunction(current_time,$input){}  
onChangeYearfunction(current_time,$input){}  
onChangeDateTimefunction(current_time,$input){}  
onShowfunction(current_time,$input){}  
onClosefunction(current_time,$input){} 
onSelectDate:function(ct,$i){
  $i.datetimepicker('destroy');
}
onGeneratefunction(current_time,$input){}trigger after construct calendar and timepicker 
withoutCopyrighttrue  
inverseButtonfalse  
scrollMonthtrue  
scrollTimetrue  
scrollInputtrue  
hours12false  
yearStart1950Start value for fast Year selector 
yearEnd2050End value for fast Year selector 
roundTimeroundRound time in timepicker, possible values: round, ceil, floor
{roundTime:'floor'}
dayOfWeekStart0

Star week DatePicker. Default Sunday - 0.

Monday - 1 ...

 
className   
weekends[] 
[
	'01.01.2014','02.01.2014','03.01.2014',
	'04.01.2014','05.01.2014','06.01.2014'
]
disabledDates[]

Disbale all dates in list

{
	disabledDates: ['01.01.2014','02.01.2014','03.01.2014','04.01.2014','05.01.2014'],
	formatDate:'d.m.Y'
}
allowDates[]

Allow all dates in list

{
	allowDates: ['01.01.2014','02.01.2014','03.01.2014','05.01.2014','06.01.2014'],
	formatDate:'d.m.Y'
}
allowDateRe[]

Use Regex to check dates

{format:'Y-m-d',allowDateRe:'\d{4}-(03-31|06-30|09-30|12-31)' }
disabledWeekDays[]

Disable days listed by index

[0, 3, 4]
id   
style   
ownerDocumentdocumentThe ownerDocument object for the datetimepicker to properly attach events and calc position (iframe support). 
contentWindowwindowThe contentWindow object that contains the datetimepicker to properly attach events (iframe support). 

Methods

show

Show Datetimepicker

$('#input').datetimepicker();
$('button.somebutton').on('click', function () {
    $('#input').datetimepicker('show');
});

hide

Hide Datetimepicker

$('#input').datetimepicker();
$(window).on('resize', function () {
    $('#input').datetimepicker('hide');
});

toggle

Sgow/Hide Datetimepicker

$('#input').datetimepicker();
$('button.trigger').on('click', function () {
    $('#input').datetimepicker('toggle');
});

destroy

Destroy datetimepicker

$('#input').datetimepicker();
$('#input').datetimepicker('destroy');

reset

Reset datetimepicker's value

$('#input').datetimepicker();
$('#input').val('12/01/2006');
$('#input')
    .datetimepicker('show')
    .datetimepicker('reset')

validate

Validate datetimepicker's value

$('#input').datetimepicker();
$('#input').datetimepicker(validate)

setOptions

Set datetimepicker's options

$('#input').datetimepicker({format: 'd.m.Y'});
$('#input').datetimepicker('setOptions', {format: 'd/m/Y'});
//or
$('#input').datetimepicker({format: 'd/m/Y'});

getValue

Get current datetimepicker's value (Date object)

$('#input').datetimepicker();
$('button.somebutton').on('click', function () {
    var d = $('#input').datetimepicker('getValue');
    console.log(d.getFullYear());
});

PHPQRCODE生成二维码

$data = 'i am qrcode';
$level = 'Q';// 纠错级别:L、M、Q、H
$size = 2;//元素尺寸
$margin = 5;//边距
$outfile = $path; //生成图片的路径,false直接输出到屏幕
$saveandprint = false;// true直接输出屏幕,false保存到文件中
$back_color = 0xFFFFFF;//白色底色
$fore_color = 0x000000;//黑色二维码色 若传参数要hexdec处理,如 $fore_color = str_replace('#','0x',$fore_color); $fore_color = hexdec('0xCCCCCC');
$QRcode = new QRcode();
//保存到文件
$QRcode->png($data, $outfile, $level, $size, $margin, false, $back_color, $fore_color);
//保存到文件并输出到屏幕
$QRcode->png($data, $outfile, $level, $size, $margin, true, $back_color, $fore_color);
//只输出到屏幕
$QRcode->png($data, false, $level, $size, $margin, false, $back_color, $fore_color);

imagecopy、imagecopymerge的区别

转自:https://www.jianshu.com/p/8023e25d9427

imagecopymerge 可以把不符合大小尺寸的图片压缩或拉伸成合适的水印大小,并对整个水印图片加透明度,但水印图片内部的透明度会被填充为默认黑色,例如带圆角的图片。

imagecopy 可以对原图素材裁剪,但不做压缩或填充。合成后保留png本身的透明度,例如圆角logo。

imagesavealpha 保存图像时是否保留完整的 alpha 通道信息(imagecopy不需要)
$img = imagecreatefromstring(file_get_contents($path));
imagealphablending($img, true);
imagesavealpha($img, true);

JS之array.sort

array.sort(compareFunction)
参数值

参数描述
compareFunction

可选。定义替代排序顺序的函数。该函数应返回负值、零值或正值,具体取决于参数,例如:

  • function(a, b){return a-b}

sort() 方法比较两个值时,将值发送给比较函数,根据返回的(负、零、正)值对值进行排序。

举例:

比较 40 和 100 时,sort() 方法调用比较函数(40,100)。

该函数计算 40-100,并返回 -60(负值)。

sort 函数会将 40 排序为小于 100 的值。

JS array.sort() 中文排序

// 创建包含中文元素的数组
var arr = ['张三', '李四', '王五'];
 
// 自定义比较函数
function compare(a, b) {
    return a.localeCompare(b); // 根据本地化设置对中文进行排序
}
 
arr.sort(compare);
console.log(arr); // 输出结果为 ["李四", "王五", "张三"]

按升序对数组中的数字排序

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a-b});

按降序对数组中的数字排序

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b-a});

数组反转

array.reverse()

深入理解JavaScript——Object(对象)

转自:https://zhuanlan.zhihu.com/p/556955018

先回顾下之前一节所讲知识

  • 引用类型指的是 object
  • object 包括内置对象、宿主对象、自定义对象
  • 内置对象中有 Object、Function、Array、String、Number、Boolean 等原生对象构造函数
  • 在 JavaScript 中,一切皆对象(除 undefined、null 外)

无论是内置对象,还是自定义对象,都是基于 Object 来创建,其中的原理是原型继承,所以笔者喜欢称 Object.prototype 为“始祖巨人”,一切力量源于尤弥尔

我们看看 Object 是什么,它能做什么,并将其扩展,连接 Object 相关的各个知识点。知识列表如下:

  • 属性与方法
  • 如何创建对象
  • 如何拷贝对象
  • 对象继承的秘密——原型
  • 继承的九种方法

属性与方法

JavaScript 对象可以从一个称为原型的对象里继承属性。对象的方法通常是继承的属性。这种”原型式继承“(prototypal inheritance)是 JavaScript 的核心特征

可以看下这个例子

var johan = { name: 'johan' };
console.dir(johan);
Object的属性与方法

能看出,我们使用对象字面量的方法创建了一个对象实例 johan,并赋予了一个属性 name,值为 johan,当打印日志时,发现多了一个对象[[Prototype]],并且这个对象中有很多对象

这是因为「对象字面量」创建的实例,在底层已经做了「隐式继承」的操作,它和 new Object('johan') 是一个意思,除此之外,如果使用 new ,会进行原型继承,[[prototype]] 正是继承 Object 的原型(即 Object.prototype)

这里,不妨多说一句,实例是继承 Object.prototype,而不是 Object,原型才会被继承,构造函数是个空壳,不信,你答应 Object 和 Object.prototype,看看内容

console.dir(Object)如下图所示:

console.dir(Object)

console.dir(Object.prototype)如下图所示

console.dir(Object.prototype)

johan 的 [[prototype]] 和 Object 的 prototype 的内容一致

关于原型和继承的内容后文会详细说明,这里埋个伏笔

看以上例子,你能发现 Object 的属性和方法不少,而且它的实例也有属性和方法,这里对其进行说明注解

静态方法

  • Object.assign():通过复制一个或多个对象来创建一个新的对象
  • Object.create():使用指定的原型对象和属性创建一个新对象
  • Object.defineProperty():给对象添加一个属性并指定该属性的配置
  • Object.defineProperties():给对象添加多个属性并分别指定它们的配置
  • Object.entries():返回给定对象自身可枚举属性的 [key, value] 数组
  • Object.keys():返回一个包含所有给定对象自身可枚举属性名称的数组
  • Object.values():返回给定对象自身可枚举值的数组

实例属性

  • Object.prototype.constructor:一个引用值,指向 Object 构造函数
  • Object.prototype.__proto__:指向一个对象,当一个 object 实例化时,使用该对象作为实例化对象的原型

实例方法

  • Object.prototype.hasOwnProperty():返回一个布尔值,用于表示一个对象自身是否包含指定的属性,该方法并不会查找原型链上继承来的属性
    • 用 hasOwnProperty 就能检测出,它能区别自身属性与继承属性
  • Object.prototype.isPrototypeOf():返回一个布尔值,用于表示该方法所调用的对象是否在指定对象的原型链中
  • Object.prototype.toString():返回一个代表该对象的字符串。
  • Object.prototype.valueOf():返回指定对象的原始值

更多信息可以查看 MDN

了解 Object 的属性、方法,以及基于它创建的实例属性和方法后,我们去看看如何创建对象

创建对象

有三种方法。对象直接量、关键字 new、 Object.create 函数来创建对象

对象直接量

创建一个新对象的最简单的方法,就是用对象直接量,就如使用以下语句:

var obj = {};

{} 表示的 new Object()

关键字 new

使用 new 创建新对象,一般要跟随一个函数调用。这里的函数称为构造函数(constructor),构造函数用以初始化一个新创建的对象。例如:

var obj = new Object(); // 效果如同 var obj = {}

更多内容,可查看这篇 new 做了什么

Object.create

此方法是 ECMAScript 5 定义了,它牵扯到原型、继承等方面的知识。简单来说,它创造了一个新对象,其中第一个参数就是这个对象的原型。而第二个可选参数,是对其属性的更多描述。例如:

var obj = Object.create({ name: 'johan', age: 23 }); // obj 继承了属性name 和 age
var obj2 = Object.create(null); // obj2 不继承任何属性和方法
var obj3 = Object.create(Object.prototype); // 与 {} 和 new Object() 一个意思

更多内容,可查看这篇 Object.create

之所以将 new 和 Object.create 单独拿出来说,是因为两则都是比较重要的知识点,非一两句就能说明白

了解 Object 是如何创造的之后,我们看看如何赋值

如何拷贝对象

赋值是简单的,但赋值后的再赋值,就会引起源对象被修改

var o1 = { name: 'johan' };
var o2 = o1;
o2.name = 'elaine';
console.log(o1); // {name: 'elaine'}
console.log(o2); // {name: 'elaine'}

之前文章也说过,因为 Object 是引用类型,引用类型的拷贝拷贝的是引用地址,所以当 o2 被修改时,o1 也随之被修改

针对如何拷贝对象,这篇文章拷贝的秘密会对其进行说明

对象继承的秘密——原型

要想解释 JavaScript 中为什么大多数元素都是对象,就必须先知道原型。JavaScript 是一门基于原型的语言——每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性。原型对象也可能拥有原型,并从中继承方法和属性,一层一层,以此类推。这种关系常被称为原型链

有关原型和原型链的知识,会归纳总结为一篇——原型

继承的九种方法

原型是实现继承的方法之一,当然 JavaScript 还有其他的方法,总共九种

  • 原型链继承
  • 盗用构造函数
  • 组合继承(原型链+盗用构造函数)
  • 原型式继承
    • Object.create
    • Object.setPrototypeOf
  • 寄生式继承
  • 寄生式组合继承
    • Object.create + 盗用构造函数
    • Object.setPrototypeOf + 盗用构造函数
  • 类继承

具体的文章会在继承说明

总结

这一节,我们就 Object 进行展开,详细说明了 Object 及其实例的属性与方法。并对如何创建对象、如何拷贝对象、原型、继承等进行说明分析,因篇幅以及知识点聚焦问题,本节不做过多说明,下一节,我们从如何创建对象之new说起


系列文章

2025-08-31 星期日 农历七月初九