我有一个接受PDO构造函数中现有连接的类:
class Foo {
public function __construct(\PDO $conn = NULL) {
// ...
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:有没有办法确定现有PDO连接当前使用的驱动程序(最好从此处的列表中找到)?我在API文档中没有看到任何内容.
对于好奇,我想知道正在使用哪个驱动程序,因为我的类中的功能是特定于数据库的,所以我想要一种方法来验证传递给它的连接是否是正确的类型.
我发现自己经常这样做:
$foo = true;
$foo = $foo && false; // bool(false)
Run Code Online (Sandbox Code Playgroud)
使用按位运算符,您可以使用&=和|=简写:
$foo = 1;
$foo &= 0; // int(0)
Run Code Online (Sandbox Code Playgroud)
鉴于按位运算1并且0在功能上等效于true和的布尔运算false,我们可以依赖于类型转换并执行以下操作:
$foo = true;
$foo &= false; // int(0)
$foo = (bool)$foo; // bool(false)
Run Code Online (Sandbox Code Playgroud)
...但是这很丑陋并且违背了使用速记赋值语法的目的,因为我们必须使用另一个语句来将类型返回到布尔值.
我真正想做的是这样的事情:
$foo = true;
$foo &&= false; // bool(false)
Run Code Online (Sandbox Code Playgroud)
......但&&=和||=无效的运营商,很明显.所以,我的问题是 - 是否有一些其他含糖的语法或者可能是一个不起眼的核心功能可以作为替身?如果变量尽可能短$foo,那么使用$foo = $foo && false语法并不是什么大问题,但是具有多个维度的数组元素和/或对象方法调用会使语法非常冗长.
我的应用程序包括几个以编程方式滚动到页面上的特定元素的功能.不幸的是,它不适用于Safari/iPad.我尝试了以下滚动方法:
window.scroll(0, y);
window.scrollTo(0, y);
$(window).scrollTop(y);
$('html, body').animate({
scrollTop: y
});
Run Code Online (Sandbox Code Playgroud)
是不是可以以编程方式在Safari/iPad上滚动窗口,或者我只是错误地做了?所有这些方法都适用于我在PC上测试的所有浏览器.
免责声明:我完全清楚表示日期/时间的最佳方式是Unix时间戳或PHP的DateTime类和Oracle的DATE数据类型.
有了这个,我想知道什么是最适合存储时间数据的数据类型(在PHP中,以及Oracle).我对存储日期组件不感兴趣; 只有时间.
例如,假设我有一个employee实体,我想要存储他/她的典型工作时间表.该员工可能在上午8:00至下午5:00工作.这些时间没有日期组件,那么应该用什么来存储它们并代表它们呢?
我考虑的选项:
DateTime和Oracle DATE具有规范化/未使用的日期组件,例如0001-01-01.integer和Oracle TIMESTAMP).目前我正在使用#3,但有点让我感到困惑的是,我似乎在滥用这些数据类型.但是,就我所知,它提供了最佳的可用性.比较和排序PHP和Unix中预期的所有工作,可以维护时区数据,并且实际上不需要任何特殊操作来显示数据.
我忽略了什么,还是有更合适的方式?
我有一个使用魔术方法来存储属性的类.这是一个简化的例子:
class Foo {
protected $props;
public function __construct(array $props = array()) {
$this->props = $props;
}
public function __get($prop) {
return $this->props[$prop];
}
public function __set($prop, $val) {
$this->props[$prop] = $val;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试为PDOStatement它的每个数据库行实例化此类的对象,就像这样(不起作用):
$st->setFetchMode(PDO::FETCH_CLASS, 'Foo');
foreach ($st as $row) {
var_dump($row);
}
Run Code Online (Sandbox Code Playgroud)
问题是,在设置属性值时,我的类PDO::FETCH_CLASS似乎没有触发魔术__set()方法.
如何使用PDO实现所需效果?
鉴于调用的结果,提供imagettfbbox()的正确的像素完美点是什么imagettftext(),文本不会超出其边界框?
我正在从边界框中确定基线的宽度/高度和x/y,如下所示:
$box = imagettfbbox($size, $angle, $font, $text);
$boxXCoords = array($box[0], $box[2], $box[4], $box[6]);
$boxYCoords = array($box[1], $box[3], $box[5], $box[7]);
$boxWidth = max($boxXCoords) - min($boxXCoords);
$boxHeight = max($boxYCoords) - min($boxYCoords);
$boxBaseX = abs(min($boxXCoords));
$boxBaseY = abs(min($boxYCoords));
Run Code Online (Sandbox Code Playgroud)
然后,我在边界框尺寸的图像上绘制一个填充矩形:
imagefilledrectangle($image, 0, 0, $boxWidth - 1, $boxHeight - 1, $color);
Run Code Online (Sandbox Code Playgroud)
之后,我画了文字:
imagettftext($image, $size, $angle, $boxBaseX, $boxBaseY, $color, $font, $text);
Run Code Online (Sandbox Code Playgroud)
但是,这会导致文本超出矩形一两个像素.我已经看过几次尝试在PHP的imagettfbbox()文档中解决这个问题,但他们都建议在这里和那里减去一两个像素,这对我来说似乎是一个黑客.这里发生了什么,为什么我们需要捏造数字以使事情正确?
PHP中有没有办法进行静态代码分析并检测对register_globals主动性的依赖?手动检查文件并查找尚未初始化的变量并从中推断可能依赖于它的变量相对简单,但我需要为数百个脚本执行此操作,因此我正在寻找自动化解决方案.
我的最后一招是设置开发环境,关闭指令并严格报告错误并让QA玩了很长时间,然后修复错误日志捕获的实例,但不能保证找到100%的情况如果存在自动化解决方案,当然也不能很好地利用资源.
从另一个答案中可以看出,有几种方法可以同时迭代两个相同大小的数组; 但是,所有这些方法都存在相当严重的缺陷.以下是一些建议方法的注意事项:
FALSE在其中一个数组中使用值.我的问题是 - 是否有一种方法可以做到这一点,不会受到任何这些(或其他)重大警告的影响?
请记住,我只是出于好奇而问这个问题; 我没有考虑用例,甚至不知道这种情况是否确实存在,或者在现实世界中是否有用/实用.但是,这里有一些示例数据:
$arr1 = [ 'a' => 1, 'b' => FALSE, 'c' => new DateTime() ];
$arr2 = [ 'foo', TRUE, 7 ];
Run Code Online (Sandbox Code Playgroud) 以下哪一项是为phpDocumentor记录此方法的返回类型的正确方法?
方法1:
/**
* @return array Foo array.
*/
public function foo() {
return array(1, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)
方法2:
/**
* @return integer[] Foo array.
*/
public function foo() {
return array(1, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)
此外,这两种方法都有任何IDE含义吗?
编辑:
似乎PhpStorm和Netbeans 7.1+ IDE都支持第二种方法.
我正在尝试使用PHPUnit的作者描述的这个方法来模拟一个单例,并且使用它的一个方法:
public function setUp() {
$this->_foo = $this->getMockBuilder('Foo')
->disableOriginalConstructor()
->getMock();
$this->_foo->expects($this->any())
->method('bar')
->will($this->returnValue('bar'));
var_dump($this->_foo->bar());
}
Run Code Online (Sandbox Code Playgroud)
问题是NULL每次都会转储.据我了解,当你模拟一个对象时,所有的方法都会被返回的存根替换,NULL除非像我正在做的那样明确地存根.所以,既然我已经删除了该bar()方法,为什么它不会转储预期的'bar'字符串?我做错了什么?