PHP的干净代码,命名约定和文档的一些最佳实践是什么?
我看到用户/人说这是一种不好的做法,例如:
// Create an array to hold x values
$arr_x = array();
Run Code Online (Sandbox Code Playgroud)
这是一个不必要的注释,因为语法单独解释了功能.这应该更多的是描述脚本/函数功能的标题注释,而不是程序的变量/流程.例
/**
* Create an array
*/
function create_array() {
return array();
}
$arr_x = create_array();
// This is just to show the comments and the code is not tested or used except for this example
Run Code Online (Sandbox Code Playgroud)
这使我走上了正确的语法,编码和文档的路径(标题命名的原因).
变量,函数和脚本命名约定可接受的是什么,还是个人偏好?
$varX
function varX()
varX.php
Run Code Online (Sandbox Code Playgroud)
要么
$var_x
function var_x()
var_x.php
Run Code Online (Sandbox Code Playgroud)
我试图找出是否有符合要求的标准.谢谢
注意:我正在使用Zend Framework,但我认为大部分内容都适用于PHP编码.
我正在尝试选择一种编写视图脚本的策略,可能需要借助模板引擎.动机:清晰度和安全性.我对编写.phtml脚本感到不满意.这种语法非常冗长,可以完成最常用的操作 - 输出变量:
<?php echo $this->escape($this->myVariable); ?>
Run Code Online (Sandbox Code Playgroud)
除了代码冗长之外,恕我直言,模板作者每次他/她想要输出变量时都不应该记住(并且费心)写一个转义调用.忘记呼叫几乎肯定会导致XSS漏洞.
我有两个可能的解决方案来解决这个问题
解决方案1:具有自动转义的模板引擎
我认为至少Smarty可以选择在输出变量时自动转义html实体.有针对Smarty的观点,但可能至少其中一些在即将到来的3.0中得到解决 - 我还没有检查过.
PHPTAL等基于XML的模板引擎默认也会转义任何数据.不过,对于初学者来说,它们看起来可能很奇怪.也许还值得尝试?
解决方案2:转义模型中的数据
当然,另一种选择是逃避模型中已经存在的所需数据(甚至控制器?).模型应该已经知道每个字段的内容类型(主要是纯文本或HTML文本),因此在那里转义数据是合乎逻辑的.该视图可以将所有数据视为安全的HTML.这将允许例如.将字段的数据类型从纯文本更改为HTML而不触及视图脚本 - 只需更改模型即可.
但话说回来,它并不像MVC那样好.此外,这种方法也存在问题:
foo & bar为foo &am(最早逃脱它为foo & bar)(这些问题可以通过提供两个版本的数据来解决,或者在模板中进行转换.对我来说似乎不好.)
想法?我错过了什么吗?您认为"最佳实践"是什么?
PS.这篇文章是关于发现了可包含任何用户提供的明文数据的通用解决方案<或>或任何其他字符.因此,在将数据保存到数据库之前过滤数据不是解决方案.
更新:
感谢所有评论到目前为止.我做了一些更多的研究,接下来将评估Twig和可能的Open Power Template.两者看起来都很有趣:Twig看起来很简单,但项目很年轻.在XML方面,OPT的语法看起来比PHPTAL好一点.Twig和OPT都有很好的记录.
我在代码中"克隆"了对象.例如:
objClone = objOriginal
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我在xcode项目的资源中有一个带有Array类型的根的plist文件.在按钮上单击我需要访问此plist并查找plist是否已包含特定项目,如果没有将新项目(NSString)写入plist.
我这样做如下,
NSMutableArray *array = nil;
NSDictionary *dictionary = nil;
path = [[NSBundle mainBundle] pathForResource:@"MyPlistName" ofType:@"plist"];
array = [[NSMutableArray alloc] initWithContentsOfFile:path];
dictionary = [self.dictionary objectForKey:@"tag"];
if(![array containsObject:dictionary])
{
[array addObject:dictionary];
if(![array writeToFile:path atomically:YES])
{
NSLog(@".plist writing was unsucessfull");
}
}
Run Code Online (Sandbox Code Playgroud)
这对我在模拟器上有效,但是当我在设备上运行时,writeToFile:atomically方法似乎总是返回NO.
我甚至尝试过使用NSArchiver,即使这似乎也没有将NO作为返回值
谁能说出我做错了什么..
问候,
Syed Yusuf
我能以更清洁的方式实现这一目标吗?会真的被批评.
switch($vocation) {
case 1: $vocation = "Sorcerer"; break;
case 2: $vocation = "Druid"; break;
case 3: $vocation = "Paladin"; break;
case 4: $vocation = "Knight"; break;
case 5: $vocation = "Master Sorcerer"; break;
case 6: $vocation = "Elder Druid"; break;
case 7: $vocation = "Royal Paladin"; break;
case 8: $vocation = "Elite Knight"; break;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
并抱歉标题无法找出更好的一个
我必须以幻灯片的形式保存大量的培训材料.
乍一看,我注意到OpenOffice OOImpress中不支持版本控制(但我可能错了).
我应该使用哪种工具来轻松维护我的培训材料?
我想过使用LaTeX + Beamer以便我可以轻松地将版本控制放在幻灯片的源代码中,但非技术人员应该能够更新材料,我宁愿不强迫他们学习LaTeX.
我已经开始实现cvDisplayLink来驱动渲染循环而不是nstimer,详见本技术说明https://developer.apple.com/library/archive/qa/qa1385/_index.html
在displaylink回调本身中进行实际渲染是否更好,或者我应该在视图上调用setNeedsDisplay并让主线程进行渲染?
为了直接在回调中呈现,我需要锁定opengl上下文,这是我希望避免的.
是否可以使用cvDisplayLink进行计时并仍然在主线程上呈现?
提前感谢任何反馈......
一旦我的安装程序完成应用程序 exe 新版本的安装,我想告诉资源管理器使用新 exe 的图标作为其快捷方式。但是,我不知道该怎么做。
从网上看,问题似乎是系统图像列表缓存了旧版本的图标。我尝试使用参数调用SHChangeNotifySHCNE_UPDATEIMAGE。我尝试致电SHUpdateImage。我什至尝试过大锤式的广播方式WM_SETTINGCHANGE。似乎什么都不起作用。
完全有可能我只是做错了什么。任何帮助,将不胜感激。
警告:下面是非常丑陋的测试代码。
#if 1
// First attempt: using shell functions
wchar_t icon_path[MAX_PATH];
int icon_index;
UINT icon_flags;
IShellFolder *desktop_folder;
IShellFolder *sub_folder;
IExtractIcon *extract_icon;
LPITEMIDLIST pidl;
SHGetDesktopFolder(&desktop_folder);
wchar_t *folder_path = L"C:\\Documents and Settings\\All Users\\Start Menu\\Programs\\MyCompany\\";
desktop_folder->ParseDisplayName(NULL, NULL, folder_path, NULL, &pidl,
NULL);
desktop_folder->BindToObject(pidl, NULL, IID_IShellFolder,
(void**) &sub_folder);
sub_folder->ParseDisplayName(NULL, NULL, L"MyApp.lnk", NULL, &pidl,
NULL);
sub_folder->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*) &pidl,
IID_IExtractIcon, NULL, (void**) &extract_icon);
extract_icon->GetIconLocation(0, icon_path, MAX_PATH,
&icon_index, &icon_flags); …Run Code Online (Sandbox Code Playgroud) 任何人都能解释一下如何foldr运作?
拿这些例子:
Prelude> foldr (-) 54 [10, 11]
53
Prelude> foldr (\x y -> (x+y)/2) 54 [12, 4, 10, 6]
12.0
Run Code Online (Sandbox Code Playgroud)
我对这些处决感到困惑.有什么建议?
一位朋友正在编写一个广告脚本,用于在HTML代码中放置选定短语的链接.
当然,如果短语已经在一个<a>元素内(或另一个不允许它的元素 - 就像在元素的属性中找到短语一样),他不希望脚本写出一个链接,因为它会破坏验证.
他问我的想法.在经历了一些笨拙的事后,我问你所想的一切.
只是为了澄清,输入是HTML中的整篇博客文章.例:
<p>This is a short blog post about ponies!</p>
<p>I have <a href="/ponies">written about ponies before</a>.</p>
<p><img src="/media/ponies.jpg" /></p>
Run Code Online (Sandbox Code Playgroud)
对于这个例子,假设我想ponies用<a href="http://www.ponies.com">ponies</a>(但是用原始情况)替换(任何情况).
上面的输出应为:
<p>This is a short blog post about <a href="http://www.ponies.com">ponies</a>!</p>
<p>I have <a href="/ponies">written about ponies before</a>.</p>
<p><img src="/media/ponies.jpg" /></p>
Run Code Online (Sandbox Code Playgroud)
我们不需要完整的代码,但非常欢迎好的想法/正则表达.他用PHP写这个,但语言中立很好.