为了响应对meta的功能请求,我今天花了几个小时在php中创建功能。

此应用程序为您的GitHub存储库(或您想要的其他任何地方)添加了一个评审盾。 br />
如下所示:



要使用它,请使用标准图像/链接标记,如下所示:

[![Code Review](https://www.zomis.net/codereview/shield/?qid=54737)](https://codereview.stackexchange.com/q/54737/31562)


54737替换为您要定向的问题ID,并用您的用户ID替换31562(这样您就可以获取广播员/助推器/公关徽章)。

您还可以使用Code Review Shield Creator来创建您的屏蔽。徽章的显示方式有多种:橙色背景

带有可接受答案的问题会显示观看次数和格力n background

代码的工作方式

由于每日Stack Exchange API限制为10,000个请求,我通过将以前的结果存储在数据库表中来避免过多的API请求,并且仅在距该问题的上一个API请求超过一个小时后才执行新请求。

代码包含以下功能:



buildURL($apiCall, $site, $filter, $apiKey):创建用于Stack Exchange API调用的URL(以供将来使用,我检查apiCall参数是否包含“?”。)

apiCall($apiCall, $site, $filter):执行HTTP请求以使用curl的Stack Exchange API,以纯字符串形式返回JSON数据

fetchQuestion($qid, $db):将apiCall检索到的JSON数据用作关联数组,从中提取有趣的数据,更新数据库并调用useData

useData($data):采用关联数组并为其创建SVG XML

dbOrAPI($qid, $db):主要入口点。 $qid是代码审查问题ID,$db是PDO对象。检查数据库中是否存在qid并使用它(如果它是最新的),否则调用fetchQuestion
/ Zomis / CodeReview-Shield

<?php

require 'conf.php';

function buildURL($apiCall, $site, $filter, $apiKey) {
    if (strpos($apiCall, '?') === false) {
        $apiCall = $apiCall + "?dummy";
    }
    return "https://api.stackexchange.com/2.2/" . $apiCall
                . "&site=" . $site
                . "&filter=" . $filter . "&key=" . $apiKey;
}

function apiCall($apiCall, $site, $filter) {
    global $apiKey;
    $url = buildURL($apiCall, $site, $filter, $apiKey);
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);

    if ($result === false) {
        $error = curl_error($ch);
        curl_close($ch);
        throw new Exception("Error calling Stack Exchange API: $error");
    }
    curl_close($ch);
    return $result;
}

function fetchQuestion($qid, $db) {
    $filter = "!)rcjzniPuafk4WNG65yr";
    $data = apiCall("questions/$qid?order=desc&sort=activity", 'codereview', $filter);
    $json = json_decode($data, true);
    $question = $json['items'][0];
    $dbfields = array("is_answered", "view_count", "favorite_count", "answer_count", "score", "accepted_answer_id");


    $sql = 'INSERT INTO cr_badge (question_id, is_answered, favorite_count, answer_count, view_count, score, fetch_time, accepted_answer_id) ' .
        'VALUES (:qid, :is_answered, :favorite_count, :answer_count, :view_count, :score, :time, :accepted_answer_id) ON DUPLICATE KEY UPDATE ' .
        'is_answered = :is_answered, favorite_count = :favorite_count, answer_count = :answer_count, view_count = :view_count, score = :score, fetch_time = :time, accepted_answer_id = :accepted_answer_id ;';
    $stmt = $db->prepare($sql);
    $sql_params = array();
    foreach ($dbfields as $field_name) {
        if (isset($question[$field_name])) {
            $sql_params[':' . $field_name] = $question[$field_name];
        } else {
            $sql_params[':' . $field_name] = 0;
        }
    }
    $sql_params[':qid'] = $qid;
    $sql_params[':time'] = time();
    $result = $stmt->execute($sql_params);
    if ($result) {
        useData($question);
    } else {
        print_r($stmt->errorInfo());
    }


    return $json;
}

function useData($data) {
    header('Content-type: image/svg+xml; charset=utf-8');
    $is_answered = $data['text'];
    $text = 'reviewed';
    if (isset($data['accepted_answer_id']) && $data['accepted_answer_id'] != 0) {
        $color = '97ca00';
        $mode = 'views';
    } elseif ($data['answer_count'] >= 1) {
        $color = 'ff8000';
        $right = $data['score'] . ' score';
        $mode = 'answers';
    } else {
        $color = 'e05d44';
        $text = 'reviewing';
        $mode = 'score';
    }
    if (isset($_GET['mode'])) {
        $mode = $_GET['mode'];
    }
    $data['answers'] = $data['answer_count'];
    $data['views'] = $data['view_count'];
    $right = $data[$mode] . ' ' . $mode;

    $svg = <<<END
<svg xmlns="http://www.w3.org/2000/svg" width="137" height="20">
<linearGradient id="b" x2="0" y2="100%">
<stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
<stop offset="1" stop-opacity=".1"/>
</linearGradient>
<mask id="a">
<rect width="137" height="20" rx="3" fill="#fff"/>
</mask>
<g mask="url(#a)">
<path fill="#555" d="M0 0h62v20H0z"/>
<path fill="#$color" d="M62 0h75v20H62z"/>
<path fill="url(#b)" d="M0 0h137v20H0z"/>
</g>
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
<text x="31" y="15" fill="#010101" fill-opacity=".3">$text</text>
<text x="31" y="14">$text</text>
<text x="98.5" y="15" fill="#010101" fill-opacity=".3">$right</text>
<text x="98.5" y="14">$right</text>
</g>
</svg>
END;
    echo $svg;
}

function dbOrAPI($qid, $db) {

    $sql = 'SELECT is_answered, favorite_count, answer_count, view_count, score, fetch_time, accepted_answer_id FROM cr_badge WHERE question_id = :qid;';

    $stmt = $db->prepare($sql);
    $result = $stmt->execute(array(':qid' => $qid));
    if ($result) {
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        $time = $row['fetch_time'];
        if ($time < time() - 3600) { // if time was updated more than one hour ago
            // fetch data again
            fetchQuestion($qid, $db);
        } else {
            useData($row);
        }
    } else {
        print_r($stmt->errorInfo());
    }
}

if (isset($_GET['qid'])) {
    $qid = $_GET['qid'];
} else {
    die("No qid set");
}

try {
    $db = new PDO($dbhostname, $dbuser, $dbpass);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
    return false;
}

dbOrAPI($qid, $db);


主要问题

自从我使用PHP已经有一段时间了,所以我有兴趣知道我是否我坚持使用PHP约定(如果有的话),并且如果我按原意使用它的话。 >

评论

PHP编码标准:github.com/php-fig/fig-standards。 (注意:我不喜欢所有这些,尤其是埃及括号的使用。)

我发出了将CodeReview-Shield添加到您的CodeReview-Shield存储库的请求请求。哈哈

我发现中等绿色的浅灰色文本有点难以阅读。我会选择深绿色或纯绿色的文字。

@IsmaelMiguel您已经可以使用它了,请参阅GitHub存储库,我在这篇文章中也包含了使用说明。唯一的事情是我托管了该服务,而不是Stack Exchange / Shields.io / GitHub /其他。

该工具如何扩展到多个提交的多个CR?提交者是否需要在每个拉取请求中更新问题/用户号?还是为每次提交使用单独的徽章更合适?如果是这样,这些徽章会住在哪里?

#1 楼

就个人而言,您的代码确实很干净,构想很棒,我真的希望看到它很快实现。




我看到了很多基本的if-else语句,如果您是三元组,使用它们确实会使这些语句变细,但这是有代价的的可读性。请参见以下示例以供使用:

($time < time() - 3600 ? fetchQuestion($qid, $db) : useData($row));
($result ? useData($question) : print_r($stmt->errorInfo()));


我确实相信某些版本的PHP也支持(a == a ?: doStuff());语法,但是可能会误会。


有些地方不一致或不符合标准:


$apiCall = $apiCall + "?dummy"; 



应该是$apiCall .= "?dummy";,并且在连接字符串时不应该使用+,而最好是使用.。喜欢:'words$varmorewords',我建议之所以这样,是因为它对读者更友好,并且由于前者可能会有问题,所以最好用大括号括起来:用. $var .代替前者。很多人都犯了这个错误,我什至也是如此。
'words{$var}morewords'curl语句上方有两个空行,它们不需要在那里。 get_file_contents,然后再不使用它,我建议用return $json替换它的值,以使您的fetchQuestion()循环看起来更整洁。
您可以考虑将SVG保留在另一个文件中并替换您的变量,但我不是100以代码标准/最佳实践的百分率表示。 br />您为最终帖子中当前未使用的每个帖子检索并存储了很多变量:useData():未使用,$is_answered:已使用,$data['accepted_answer_id']:未使用,if:未使用,useData():未使用,isset:未使用。

尽管我可以看到将来使用这些更新,并且现在捕获它们非常棒,但是您可以考虑对其进行修改。

关于未来实现的主题,按钮上的计分器也很酷。

您可以考虑在项目中实现''和类似类的结构,以便可以在外部更轻松地使用它。


评论


\ $ \ begingroup \ $
1.对于PHP,我想我会避免这种情况。 2.糟糕,我想这就是从Java复制代码并将其转换为PHP时发生的情况。 3. file_get_contents无法正常工作,必须使用curl :) 4.糟糕,在删除这些代码后忘记复制粘贴新代码(这是我所做的仅有的一点更改)5.确实,谢谢。 6.可能是一个好主意,这也可能导致使用不同的SVG模板的可能性。我喜欢。 7. SE API的JSON可能没有该设置,我的印象是PHP添加了警告或注意(如果我不这样做),但是我可能是错的。 8.更多的被使用。
\ $ \ endgroup \ $
–西蒙·福斯伯格
2015年7月1日在15:00

\ $ \ begingroup \ $
“应该是$ apiCall。=”?dummy“ ;,并且在连接字符串时不应该使用+”->您应该说“您必须使用$ apiCall。=“”?dummy“ ;.使用+连接字符串会导致字母总和始终为0。此外,您也可以将其视为错误。
\ $ \ endgroup \ $
–伊斯梅尔·米格尔(Ismael Miguel)
15年7月2日在9:17

\ $ \ begingroup \ $
另外,我注意到您以“ words $ varmorewords”为例。因为单引号内的变量没有扩展,所以它回显了单词$ varmorewords。如果替换引号,则将出现一个丑陋的错误,因为$ varmorewords是单个变量,不存在。它应该是“ words {$ var} morewords”。
\ $ \ endgroup \ $
–伊斯梅尔·米格尔(Ismael Miguel)
15年7月2日在10:55

\ $ \ begingroup \ $
顺便说一句,使用。字符串连接的运算符是一个绝不应该发生的可憎的事情。
\ $ \ endgroup \ $
–瑞安
15年7月2日在16:22

\ $ \ begingroup \ $
关于第一点:在很多情况下,降低可读性以节省字符数被认为是一件好事。三元是一个很好的例子。第2点将呈现字符串文字,您需要建议使用双引号。第3点:两者都有什么问题?它们对于自己的目的都是有用的。要点5:isset很重要,永远不要建议删除它。
\ $ \ endgroup \ $
–罗比·阿夫里尔(Robbie Averill)
16年5月18日在20:34

#2 楼

我想这和PHP一样漂亮:p
(发现这种怪癖我真没意思。)


    if (isset($question[$field_name])) {
        $sql_params[':' . $field_name] = $question[$field_name];
    } else {
        $sql_params[':' . $field_name] = 0;
    }



我很惊讶我们三元的好朋友@Quill忘了包括这个主要候选人:

$sql_params[':' . $field_name] = isset($question[$field_name]) ? $question[$field_name] : 0;



让我有点失望的另一件事是中间的代码:




这是什么意思?这个价值从何而来?重要吗?

像所有魔术常量一样,最好使用描述性名称将其放在文件顶部。


最后,也许根本不可行,
,但是能够使用CSS设置显示样式,而不是使用硬编码的$color值会很好。


最后,strpos($apiCall, '?') === false具有足够的神秘性(PHP的错误,而不是您的错误),可能值得用辅助方法将其封装:代码干净且可读性强,并隔离垃圾,垃圾。

评论


\ $ \ begingroup \ $
1.是的,PHP中的strpos不好玩(但同样,它是PHP,这是什么?)。 2.我同意那个三元论。 3.筛选器用于Stack Exchange API,这样我就只获得我感兴趣的信息-节省带宽。我不同意所有常量都应该在顶部声明。它仅使用一次,它直接与SE API相关联,我认为将其放在顶部不会带来任何好处。 4.我正在输出用于SVG图形的XML,我怀疑是否可以在其中使用CSS。我全力以赴使其更具动态性,但是我不认为CSS是要走的路:)
\ $ \ endgroup \ $
–西蒙·福斯伯格
15年7月1日在21:32

\ $ \ begingroup \ $
我没有弄明白strpos()有什么问题。除了参数的顺序。
\ $ \ endgroup \ $
–伊斯梅尔·米格尔(Ismael Miguel)
15年7月1日在22:44

\ $ \ begingroup \ $
如果这是100%的想法,我会在回答中加上它;-)没错,我没有解释太多,preg_match的问题在于它不是惯用语言。相比之下,strpos仍然更容易记住和阅读。也许并不逊色。但是至少对我来说,建议改变还不够。
\ $ \ endgroup \ $
– janos
15年7月2日在10:11

\ $ \ begingroup \ $
@janos我完全同意。有人需要为PHP创建一个不错的字符串库。
\ $ \ endgroup \ $
–伊斯梅尔·米格尔(Ismael Miguel)
15年7月2日在10:16

\ $ \ begingroup \ $
@Simon我还对strpos提出了另一点意见。关于“!)rcjzniPuafk4WNG65yr”,这是一个不可理解的事情,其目的在代码中间并不明显。当某些东西无法解释时,我无法相信它,并假设有一天它可能会发生莫名其妙的变化,然后我就不想从代码的中间挖掘出来。这就是为什么我更喜欢在顶部这样的东西,在上面容易看到,并带有描述性的名称,甚至是注释以说明其来源。
\ $ \ endgroup \ $
– janos
15年7月2日在12:16

#3 楼

Disclamer:

我的评论要简短,比我期望的要长,但我只会关注useData()函数。


让我们开始吧!


我脑海中冒出的第一件事就是那堆巨大的东西缩进的SVG:


     $svg = <<<END
<svg xmlns="http://www.w3.org/2000/svg" width="137" height="20">
<linearGradient id="b" x2="0" y2="100%">
<stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
<stop offset="1" stop-opacity=".1"/>
</linearGradient>
<mask id="a">
<rect width="137" height="20" rx="3" fill="#fff"/>
</mask>
<g mask="url(#a)">
<path fill="#555" d="M0 0h62v20H0z"/>
<path fill="#$color" d="M62 0h75v20H62z"/>
<path fill="url(#b)" d="M0 0h137v20H0z"/>
</g>
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
<text x="31" y="15" fill="#010101" fill-opacity=".3">$text</text>
<text x="31" y="14">$text</text>
<text x="98.5" y="15" fill="#010101" fill-opacity=".3">$right</text>
<text x="98.5" y="14">$right</text>
</g>
</svg>
END;
    echo $svg;
 


它肯定需要一些缩进。真是一团糟!考虑一下:

     $svg = <<<END
<svg xmlns="http://www.w3.org/2000/svg" width="137" height="20">
    <linearGradient id="b" x2="0" y2="100%">
        <stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
        <stop offset="1" stop-opacity=".1"/>
    </linearGradient>
    <mask id="a">
        <rect width="137" height="20" rx="3" fill="#fff"/>
    </mask>
    <g mask="url(#a)">
        <path fill="#555" d="M0 0h62v20H0z"/>
        <path fill="#$color" d="M62 0h75v20H62z"/>
        <path fill="url(#b)" d="M0 0h137v20H0z"/>
    </g>
    <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
        <text x="31" y="15" fill="#010101" fill-opacity=".3">$text</text>
        <text x="31" y="14">$text</text>
        <text x="98.5" y="15" fill="#010101" fill-opacity=".3">$right</text>
        <text x="98.5" y="14">$right</text>
    </g>
</svg>
END;
    echo $svg;
 


现在好多了!



仍然存在无用的归因。还可以修复该问题:

 echo <<<END
<svg xmlns="http://www.w3.org/2000/svg" width="137" height="20">
    <linearGradient id="b" x2="0" y2="100%">
        <stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
        <stop offset="1" stop-opacity=".1"/>
    </linearGradient>
    <mask id="a">
        <rect width="137" height="20" rx="3" fill="#fff"/>
    </mask>
    <g mask="url(#a)">
        <path fill="#555" d="M0 0h62v20H0z"/>
        <path fill="#$color" d="M62 0h75v20H62z"/>
        <path fill="url(#b)" d="M0 0h137v20H0z"/>
    </g>
    <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
        <text x="31" y="15" fill="#010101" fill-opacity=".3">$text</text>
        <text x="31" y="14">$text</text>
        <text x="98.5" y="15" fill="#010101" fill-opacity=".3">$right</text>
        <text x="98.5" y="14">$right</text>
    </g>
</svg>
END;
 




现在好点了。但是,您的SVG中丢失了“杂散”变量。

为了便于阅读,请考虑将变量包装在方括号中:

echo <<<END
<svg xmlns="http://www.w3.org/2000/svg" width="137" height="20">
    <linearGradient id="b" x2="0" y2="100%">
        <stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
        <stop offset="1" stop-opacity=".1"/>
    </linearGradient>
    <mask id="a">
        <rect width="137" height="20" rx="3" fill="#fff"/>
    </mask>
    <g mask="url(#a)">
        <path fill="#555" d="M0 0h62v20H0z"/>
        <path fill="#{$color}" d="M62 0h75v20H62z"/>
        <path fill="url(#b)" d="M0 0h137v20H0z"/>
    </g>
    <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
        <text x="31" y="15" fill="#010101" fill-opacity=".3">{$text}</text>
        <text x="31" y="14">{$text}</text>
        <text x="98.5" y="15" fill="#010101" fill-opacity=".3">{$right}</text>
        <text x="98.5" y="14">{$right}</text>
    </g>
</svg>
END;


更好,不是吗?



但是现在,您想更改颜色。你会怎么做?手动更改所有内容吗?

我提出以下(部分)代码:

 $colors = array(
    'gradient'=>'bbb',
    'mask'=>'fff',
    'back'=>array('555', 'e05d44'),
    'text'=>'010101',
    'right'=>'010101'
);
if (isset($data['accepted_answer_id']) && $data['accepted_answer_id'] != 0) {
    $color['back'][1] = '97ca00';
    $mode = 'views';
} elseif ($data['answer_count'] >= 1) {
    $colors['back'][1] = 'ff8000';
    $right = $data['score'] . ' score';
    $mode = 'answers';
} else {
    $text = 'reviewing';
    $mode = 'score';
}

// [...]

    echo <<<END
<svg xmlns="http://www.w3.org/2000/svg" width="137" height="20">
    <linearGradient id="b" x2="0" y2="100%">
        <stop offset="0" stop-color="#{$colors['gradient']}" stop-opacity=".1"/>
        <stop offset="1" stop-opacity=".1"/>
    </linearGradient>
    <mask id="a">
        <rect width="137" height="20" rx="3" fill="#{$colors['mask']}"/>
    </mask>
    <g mask="url(#a)">
        <path fill="#{$colors['back'][0]}" d="M0 0h62v20H0z"/>
        <path fill="#{$colors['back'][1]}" d="M62 0h75v20H62z"/>
        <path fill="url(#b)" d="M0 0h137v20H0z"/>
    </g>
    <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
        <text x="31" y="15" fill="#{$colors['text']}" fill-opacity=".3">{$text}</text>
        <text x="31" y="14">{$text}</text>
        <text x="98.5" y="15" fill="#{$colors['right']}" fill-opacity=".3">{$right}</text>
        <text x="98.5" y="14">{$right}</text>
    </g>
</svg>
END;
 


请注意,我已经删除了$colors变量else的颜色属性,并将其作为默认颜色。



代码:

 if (isset($_GET['mode'])) {
    $mode = $_GET['mode'];
}
$data['answers'] = $data['answer_count'];
$data['views'] = $data['view_count'];
$right = $data[$mode] . ' ' . $mode;
 


你闻到吗?我闻到代码注入了!

请始终验证您的输入。

仅使用此if即可:

if (isset($_GET['mode']) && in_array($_GET['mode'], array('views','answers','score'))) {
    $mode = $_GET['mode'];
}




这一点纯粹是主观的。

您盲目地相信自己的代码在此功能之前没有输出。

而不是: br />
header('Content-type: image/svg+xml; charset=utf-8');


考虑使用此方法:

if (!headers_sent()) {
    header('Content-type: image/svg+xml; charset=utf-8');
}


万一发生错误,它仍然会向SVG发送先前的错误,但至少不会成为错误工厂! ,我决定将其从最终代码中删除。如前所述,您有一个无用的变量($is_answered)。我也删除了它,因为它在那里什么也没做。



非常挑剔的一点是将echo <<<END更改为echo <<<SVG

这显示了回声的含义以及什么是巨大的块,而没有读取超过12个字符。


最终结果:

这是代码如下所示,并增加了几行以提高可读性:

 function useData($data) {
    header('Content-type: image/svg+xml; charset=utf-8');

    $is_answered = $data['text'];
    $text = 'reviewed';
    $colors = array(
        'gradient'=>'bbb',
        'mask'=>'fff',
        'back'=>array('555', 'e05d44'),
        'text'=>'010101',
        'right'=>'010101'
    );

    if (isset($data['accepted_answer_id']) && $data['accepted_answer_id'] != 0) {
        $color['back'][1] = '97ca00';
        $mode = 'views';
    } elseif ($data['answer_count'] >= 1) {
        $colors['back'][1] = 'ff8000';
        $right = $data['score'] . ' score';
        $mode = 'answers';
    } else {
        $text = 'reviewing';
        $mode = 'score';
    }

    if (isset($_GET['mode']) && in_array($_GET['mode'], array('views','answers','score'))) {
        $mode = $_GET['mode'];
    }

    $data['answers'] = $data['answer_count'];
    $data['views'] = $data['view_count'];

    $right = $data[$mode] . ' ' . $mode;

    echo <<<SVG
<svg xmlns="http://www.w3.org/2000/svg" width="137" height="20">
    <linearGradient id="b" x2="0" y2="100%">
        <stop offset="0" stop-color="#{$colors['gradient']}" stop-opacity=".1"/>
        <stop offset="1" stop-opacity=".1"/>
    </linearGradient>
    <mask id="a">
        <rect width="137" height="20" rx="3" fill="#{$colors['mask']}"/>
    </mask>
    <g mask="url(#a)">
        <path fill="#{$colors['back'][0]}" d="M0 0h62v20H0z"/>
        <path fill="#{$colors['back'][1]}" d="M62 0h75v20H62z"/>
        <path fill="url(#b)" d="M0 0h137v20H0z"/>
    </g>
    <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
        <text x="31" y="15" fill="#{$colors['text']}" fill-opacity=".3">{$text}</text>
        <text x="31" y="14">{$text}</text>
        <text x="98.5" y="15" fill="#{$colors['right']}" fill-opacity=".3">{$right}</text>
        <text x="98.5" y="14">{$right}</text>
    </g>
</svg>
SVG;
}
 



旁注:

在您发表任何言论之前,这主要是基于观点的而不是客观的!名称。

我强烈建议将其更改为useData(又名lowercase_and_underscore)。

为什么?如果您错误地编写了snake_case,您将很难查看usedata,只是会发现您拼写了函数名称,而PHP并不关心函数名称中的大小写。

如果您输入"Where in the living fudge is this declared???"USE_DATA或任何变体,则更容易找到名称。隐式地用Use_Data拆分名称,然后进行部分比较。 />
哪个更容易比较?


我不同意https://softwareengineering.stackexchange.com/questions/196416/whats-the-dominant-naming-在使用_进行精确定位时,在PHP-camelcase-或-undersc中使用变量约定。

此外,PHP本身也不遵循这一点!查看所有函数名称。


但是,即使将名称更改为aVeryInterestingMethodWellSpelled,也将是一个不好的名字。

为什么?好吧,这个名字使人想到您正在尝试使用一些数据来做某事。但是它在做什么?我不知道,我必须阅读整个函数才能知道。

我的建议:averyinterestingmethodwellspelled
它精确地显示了代码的作用:它输出SVG。很简单。

评论


\ $ \ begingroup \ $
我强烈不同意您的第6条建议,如果有一个错误在您想要设置标题之前就输出了某些东西,那么触发另一个错误/警告比选择静默运行更好。
\ $ \ endgroup \ $
– CodesInChaos
15年7月3日在8:12

\ $ \ begingroup \ $
@CodesInChaos我已经更改了它。我仍然保持第6点的位置,但是它不再是最终代码的一部分。这仍然是一个有效的意见。我只是不再“执行”它了。
\ $ \ endgroup \ $
–伊斯梅尔·米格尔(Ismael Miguel)
15年7月3日在10:30



\ $ \ begingroup \ $
关于_ vs CamelCase的亮点-更清晰,更易读!
\ $ \ endgroup \ $
–德米特里·扎伊采夫(Dmitri Zaitsev)
15年7月8日在4:22