小编Dou*_*dek的帖子

在HEREDOC字符串中调用PHP函数

在PHP中,HEREDOC字符串声明对于输出html块非常有用.你可以通过在$前面加上变量来解析变量,但是对于更复杂的语法(比如$ var [2] [3]),你必须把你的表达式放在{}括号中.

在PHP 5中,这可能实际上使函数调用中的{}一HEREDOC字符串中括号,但你必须要经过一些工作.函数名称本身必须存储在变量中,您必须将其称为动态命名函数.例如:

$fn = 'testfunction';
function testfunction() { return 'ok'; }
$string = <<< heredoc
plain text and now a function: {$fn()}
heredoc;
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这比仅仅更麻烦:

$string = <<< heredoc
plain text and now a function: {testfunction()}
heredoc;
Run Code Online (Sandbox Code Playgroud)

除了第一个代码示例之外还有其他方法,例如突破HEREDOC来调用函数,或者反转问题并执行以下操作:

?>
<!-- directly output html and only breaking into php for the function -->
plain text and now a function: <?PHP print testfunction(); ?>
Run Code Online (Sandbox Code Playgroud)

后者的缺点是输出直接放入输出流(除非我使用输出缓冲),这可能不是我想要的.

所以,我的问题的实质是:有更优雅的方法来解决这个问题吗?

根据回复进行编辑:看起来某种模板引擎看起来确实会让我的生活变得更轻松,但这需要我基本上颠倒我常用的PHP风格.这不是一件坏事,但它解释了我的惯性......我想找出让生活变得更轻松的方法,所以我现在正在研究模板.

php string heredoc

88
推荐指数
10
解决办法
7万
查看次数

将美国邮政编码映射到时区

当用户在我们的应用程序中注册时,我们可以在我们针对国家数据库验证邮政编码时推断他们的邮政编码.从这个邮政编码确定他们的时区的潜在猜测的最佳方法是什么?

我们正在努力减少我们明确要求他们提供的数据量.如果我们的最佳猜测是错误的,他们将能够稍后手动设置时区.我发现邮政编码无助于搞清楚美国以外的时区,但在这种情况下我们不得不手动询问,而且无论如何我们主要与美国打交道.

我发现了很多邮政编码数据库,到目前为止只有少数包含时区信息,但那些不是免费的,比如这个.如果为了做到这一点而必须支付订阅服务,那么它就不值得了,我们只需要明确询问用户.

虽然语言不是特别相关,因为我可以转换所需的东西,但我们使用的是PHP和MySQL.

timezone zipcode

82
推荐指数
5
解决办法
10万
查看次数

在Windows上使用PHP进行分叉

我们在Windows服务器上运行PHP(确实是许多问题的根源,但目前不是迁移选项).有几点需要用户启动的操作才能启动一些需要一段时间的事情以及用户在成功或失败时不需要知道的事情,例如发送电子邮件或确认一些第三方帐户已更新.如果我可以使用fork pcntl_fork(),这将非常简单,但PCNTL功能在Windows中不可用.

似乎我能得到的最接近的是做这种性质的事情:

exec( 'php-cgi.exe somescript.php' );
Run Code Online (Sandbox Code Playgroud)

但是,这会复杂得多.我需要开始的行动依赖于已经存在于运行过程中的大量上下文; 使用上面的例子,我需要找出基本数据并以某种方式将它提供给新脚本.如果我可以分叉,那只是让父进程提前返回,让孩子继续处理更多事情.

我发现有一些人在谈论他们自己在Windows上编译各种PCNTL函数的工作,但似乎没有任何东西可用(破坏的链接等).

尽管这个问题与我的名字几乎同名,但似乎问题是执行超时比需要分叉更多.所以,我最好选择重构一下来处理调用php-cgi,还是有其他选择?

编辑:似乎exec()不适用于此,至少在没有我弄清楚它的其他方面时,因为它等待直到调用返回.我想我可以使用START,有点像exec( 'start php-cgi.exe somescript.php' );,但它仍然等待,直到另一个脚本完成.

php windows fork

13
推荐指数
1
解决办法
1万
查看次数

使用分层窗口创建平滑的窗口边框

我们正在开发一款带有各种圆形边缘的皮肤应用程序.我使用窗口区域来定义非矩形形状,但几乎每个人都对象造成锯齿状混叠,因为像素只能是完全不透明或完全透明.

我已经使用分层窗口提出了一个解决方案,但我们希望确保在各种系统上运行(并希望运行良好),我想看看是否有人有更好的想法或方法优化我正在做的事情.我知道分层窗口需要win2000或更高版本,这很好,因为这已经是其他原因的要求.从一些基本测试看起来它在Vista上看起来不错,但这还不能保证.

这就是我所做的:我有一个窗口,称之为A,带有控件和文本以及包含该窗口的任何内容.我有窗口B作为窗口A的子窗口,除了它具有WS_POPUP样式而不是WS_CHILD,因此它可以将自己定位在A的区域之外并绘制在A的控件之上.窗口B也具有WS_EX_LAYERED样式,并且在初始化时,我使用ULW_ALPHA标志调用UpdateLayeredWindow,使用带有alpha通道的32位位图调用源DC,以使其以每像素alpha绘制.

窗口B的源DC中使用的位图几乎就是窗口边框周围的像素,我希望从窗口的背景平滑地混合到完全透明.我会跳过整个两个窗口的方法,只使用单个分层窗口,除了当你使用UpdateLayeredWindow时,它是从保存在内存中的缓冲区中提取的,代替典型的WM_PAINT消息和所有这些,并试图获取交互式儿童控制(和儿童窗口)能够很好地发挥作用,听起来非常麻烦(甚至可能不适用于所有事情).

因此,它基本上是窗口A,包含所有子控件等等,窗口B直接浮在它上面,绘制一个漂亮的光滑边框.我通过移动窗口B来响应WM_MOVE消息等等,并且我禁用了窗口B,因此它永远不会获得焦点或输入(点击已经通过,因为它的部分是不透明的,例如大多数它的内部部分已被排除在采摘之外).

对于踢球,这里的部分是什么样的,以显示我的意思更好一点.

所以,它有效,但我无法确定它是否真的是最好的方法.我有两个问题:

  • 这听起来是否可以接受,或者它有什么明显的可怕之处?
  • 正如它目前的工作原理,似乎它使用了窗口大小的离屏缓冲区(可以达到1024x768),即使它的极少数像素具有任何非零不透明度数据 - 它是否值得开销以及将它们切割成单独的边框并将它们合成在一起的额外复杂性?

windows winapi alpha layered

9
推荐指数
1
解决办法
3214
查看次数

在Flash 9,Actionscript 3中播放短音的延迟

我有几个非常短的音频片段(不到一秒钟)可以在各种事件上播放(按钮悬停,点击等).然而,在动作和声音的实际播放之间通常存在显着的滞后.我已经尝试将声音嵌入到.swf中,并在开始时将其加载到外部,但两者都会导致相同的结果.同样,我尝试过使用压缩和未压缩的音频.

看起来就像是音频缓冲区只是很多的时间比我需要他们,像或许闪光灯更倾向于在开始的声音多了几分延迟为代价玩更长的声音,没有任何口吃优化.这可能吗?有没有办法改变它们?因为我正在做的事情永远不需要播放超过一秒钟左右的声音并且总是在开始时完全加载,所以真的很短的缓冲区也不会有害.

另一个可能的原因可能是:如果我在使用loadSound()时使用.wav文件...我无法让它实际播放声音.没有错误,一切都按原样返回,但没有播放实际声音,这就是为什么我现在将它们作为.mp3.也许在使用.mp3音频(或任何压缩音频)时,解码时会有滞后吗?我仍然对此有疑问的原因是,当将它们作为.wav文件嵌入.swf(通过将它们导入库中)时,它们在播放时仍然具有相同的延迟.

只是为了进行健全性检查,我将包含我已经获得的代码,减去不相关的部分和错误检查.首先,在运行时加载它们:

var soundArray:Array = new Array();
loadSound( "click", "sounds/buttondroop4.mp3" );
loadSound( "hover", "sounds/Dink-Public_D-146.mp3" );

function loadSound( name:String, url:String ):void
{
   var req:URLRequest = new URLRequest( url );
   soundArray[ name ] = new Sound( req );
   soundArray[ name ].addEventListener( Event.COMPLETE, soundLoaded );
}
function soundLoaded( event:Event ):void
{
   for( var name:String in soundArray )
   {
      if( event.target == soundArray[name] )
      {
         trace( "Loaded sound [" + name + "]" );
         return;
      }
   }
}
function playSound( …
Run Code Online (Sandbox Code Playgroud)

flash audio actionscript-3

6
推荐指数
1
解决办法
7854
查看次数

设置应用程序图标的问题

(我正在使用Visual Studio 2008,但我记得也有旧版本的类似问题.)

我尝试了几种不同的方法(其中许多方法在其他问题中提到过),但我仍然遇到一些奇怪的问题:

  1. 将图标作为资源包含时,它会立即显示为可执行文件的图标,但是为了显示在任务栏上的图标,我必须重新启动计算机.在那之前,它继续显示为以前的图标.清理解决方案,重新启动VS,没有任何影响.这不是一个非常大的问题,因为它不会影响已发布的exe,但是知道它在哪里保持旧图标缓存以及如何摆脱它会很好.

  2. 无论我做什么,alt-tabbing时显示的图标是默认的应用程序图标(方形和白色以及通用).这包括嵌入在可执行文件的图标,以及设置ICON_BIGWM_SETICON.

至于第二件事,我的代码看起来像:

   hIcon = (HICON)(
      LoadImage( NULL, szFilename, IMAGE_ICON, 32, 32, LR_LOADFROMFILE ) );
   if( hIcon )
      SendMessage( hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon );
Run Code Online (Sandbox Code Playgroud)

但是,发送后WM_SETICON,GetLastError()返回6,"句柄无效.". hWnd是一个有效的窗口句柄,hIcon似乎是一个有效的图标句柄.我已经尝试寻找WM_SETICON可能导致该错误的原因,并且至少要找出它认为无效的WHICH句柄,但还没有运气.我在调用之前立即清除了错误代码SendMessage(),因此必须在处理消息时将其设置在某处.

我尝试了另一种方法,从exe本身加载图标,其中资源的ID是101(它是第一个也是唯一包含的资源):

   hIcon = (HICON)(
      LoadImage( GetModuleHandle( NULL ), MAKEINTRESOURCE( 101 ),
      IMAGE_ICON, 48, 48, 0 ) );
   if( hIcon )
      SendMessage( hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon );
Run Code Online (Sandbox Code Playgroud)

......但是同样的事情发生了; 在调用之后SendMessage(),GetLastError() …

c++ icons visual-studio-2008

6
推荐指数
1
解决办法
6441
查看次数

默认参数中的细微语法错误未被编译器捕获

我开始得到错误,"错误C2059:语法错误:'默认参数'"用于一行代码,该代码行声明了一个带有字符串参数的函数,该函数被赋予了一个默认参数.这显然有点令人沮丧,因为错误信息并不完全具有启发性(我知道这是一个'默认参数'!),而确切的声明在其他地方也可以.

在稍微改变一下声明之后,我发现它在包含类中的位置实际上有效.缩小它,我发现我通过在默认参数之一后加一个分号来错误地声明一个不同的函数.编译器似乎很好,这看起来有点奇怪.我调查了一下,并提出了以下测试用例,试图找出正在发生的事情的本质:

enum TestEnum1
{
   TEST_ONE
};
class TestClass
{
public:
   enum TestEnum2
   {
      TEST_TWO,
      TEST_THREE,
      TEST_FOUR
   };
   void Func1( int iParm = TEST_ONE; ); // additional semicolon here
   void Func2( std::string strParm = "" );
};
Run Code Online (Sandbox Code Playgroud)

如上面的代码所示,Func2将产生我上面提到的编译错误.如果我将Func2移到Func1之上,那么一切都编译得很好.

如果我将Func1中的默认参数切换为显式数字或使用在TestClass中声明的枚举,那么我会得到该行的预期语法错误.

基本上,奇怪的是,如果我将默认参数的值设置为未在当前类中直接定义的枚举,并且有点过于分号,编译器将忽略语法错误,直到其他一些看似无关的最终导致解析器以非常难以理解的方式死亡.

我完全错过了什么吗?这是预期的行为吗?我当然犹豫不决地把它称为​​编译器中的错误,但这似乎不太正确.如果只是我误解了标准的某些内容,那么我想知道我错在哪里.

c++ visual-studio-2008 visual-studio

5
推荐指数
1
解决办法
842
查看次数

查询机器规格

有什么方法可以通过编程接口查询本地机器的规格(CPU规格,操作系统版本,显卡规格和驱动程序等等)?我们正在用C#编写一个简单的应用程序来测试我们的主应用程序的兼容性,并希望将它转储出一些系统指标,但我似乎无法找到从哪里开始,使用什么接口,库,任何东西.

我尝试了各种搜索,但只能找到程序和GUI,这需要用户与之交互或必须安装.

或者,只要我们允许使用测试应用程序分发它,一个小的命令行程序也可以正常工作.

我找到了一个程序,它可以获得我想要的一些规格,PsInfo.但是,它似乎要求每个用户在首次运行时同意某些许可证,即使它是命令行应用程序.此外,它只处理操作系统/ CPU信息,我需要更多.

另外:忘了提到明确,但这确实只是Windows机器所必需的.你的人很快!

编辑:这个WMI确实看起来像我需要的,谢谢!相当多的蠕虫,所以我必须潜入.它提到,对于某些事情,用户必须具有管理员权限; 这可能不是一个大问题,但它可能会限制一点.

c# wmi

3
推荐指数
1
解决办法
2343
查看次数

当超过两次下载正在进行时 HttpSendRequest 阻塞

在我们的程序中,每次需要发出HTTP请求时都会创建一个新线程,并且可以有多个线程同时运行。我遇到的问题是,如果我已经有两个线程正在运行,它们在InternetReadFile()调用后循环读取HttpSendRequest(),任何后续的调用尝试HttpSendRequest()都会挂在该调用上,所以我最终会继续前面提到的两个线程从它们的连接中读取数据就可以了,但是第三个连接会一直阻塞,HttpSendRequest()直到超时。

从我自己找到的情况来看,这似乎就是 wininet 的工作方式,正如HTTP 规范所建议的那样:“单用户客户端不应与任何服务器或代理保持超过 2 个连接。 ”

我见过各种程序处理对同一服务器的多个同时下载,但我想他们需要做很多额外的工作才能做到这一点,在管理各种连接或编写自己的 http 接口方面。

如果需要大量额外的复杂性来将其设置为处理两个以上的活动会话,那么我只需将其更改为一次仅处理一两个文件,而将其余文件留在队列中。然而,如果有一些低复杂性的方法允许一次超过两个(我想,我猜每次下载使用一个新进程可能会起作用,但会更混乱),那就更好了;无论如何,它不会同时下载超过 3-5 个,并且每次下载都是根据用户的请求进行的。我读到一些提到注册表黑客改变限制的内容,但这绝对不是我会做的事情。有任何想法吗?

c++ http wininet

3
推荐指数
1
解决办法
3362
查看次数