在大规模建设时使用define(),Pros?缺点?

时间:2015-12-21 22:33:52

标签: php html

我批量生产非常相似的网站,这意味着它们都使用相同的基本组件,页面,并且都是单一行业特定的。这些是我的低端打折网站设计。这些网站每天都没有超过20-30个访问者,因此服务器上的任何额外负载都不是问题。

为了节省时间,因为他们都使用相同的组件,虽然它们可能位于不同的位置或不同的顺序我想写一个可以包含在每个站点的定义文件,所以我可以调用定义的常量,而不是每年在我构建的每个站点上写出几百次代码。此外,为了便于以后编辑,这将使我的生活变得更加轻松。

定义文件看起来类似于以下内容:

define('UPCONTACT','<h1>Contact Us</h1>');
define('ULCONTACT','<a href="contact_us.php">Contact Us</a>');
define('UPABOUTUS','<h1>About Us</h1>');
define('ULABOUTUS','<a href="about_us.php">About Us</a>');

显然这是一个非常基本的例子,但我认为你明白这一点。

所以问题是以这种方式使用define()的优缺点是什么?

4 个答案:

答案 0 :(得分:1)

非常好。缺点是,如果您使用常量,则不能为单个页面或站点覆盖它们。

改为使用数组:

config.php

 return array(
     'aboutus' => '<h1>About Us</h1>',
     'contactus' => '<a href="contact_us.php">Contact Us</a>'
 );

在您的网站中包含以下内容:

$config = include('config.php');

然后你可以很容易地打印它

<?php echo $config['aboutus'] ?>

您也可以在需要时更改值:

$config = include('config.php');
$config['aboutus'] = '<h1>About My Company</h1>';

这可能是你最好的选择。

答案 1 :(得分:0)

它有好处和缺点。

好处包括这种方式比从数据库加载设置(以及创建数据库;以及创建抽象层,......)更快。

缺点是客户端无法自定义此类方式。如果他们需要更改,请事先确保网站是静态的,并且每次更改都会收取费用。

恕我直言,最好有一些东西可以由客户定制,而其他东西不是。但是以这种方式使用define()完全没有技术问题(除了可能允许的数据类型)。

答案 2 :(得分:0)

使用ini文件或类似内容的更好方法。 (如果它是一个递归任务,可以从智能手机轻松编辑:)

寻找内置的php功能,可以简化你的生活

http://php.net/manual/fr/function.parse-ini-file.php

或者如果你想要一个更强大和更灵活的系统, 去模板(寻找聪明的,或自制的正则表达式模板)

寻找我的第一个正则表达式函数(几年前) Quitting Smarty to do it manually

注意:

使用Constant不会动态修改它们 内联代码,支持类型较差(例如,如果没有序列化,则无法存储数组)

答案 3 :(得分:0)

我建议使用级联的ini文件:

$conf_dir = dirname(__FILE__);
$config = array_merge_recursive(
    parse_ini_file($conf_dir.'base.ini'),
    parse_ini_file($conf_dir.'client.ini')
);

好处是可读性,无法执行(我喜欢锁定可能的内容),并且您可以跟踪basegit ini(或您使用的任何内容)而不是客户端一。有一些缺点,但这就是生活。只是觉得更清洁,但确保它们不会比.php快。

如果您想消除任何冗余执行(倾听,任何&#34;性能优势&#34;仍然有&#34;福利&#34;其中),序列化:

<?php

define('CACHE_DIR', '/tmp/');
// where 'http' is a path part that directly follows the app root, and will always
// be below where this file is called from.

$ini_cache  = CACHE_DIR.'config.ser';

if(!file_exists($ini_cache)) {
    // Build your config in any way you wish.
    $conf_dir = dirname(__FILE__);
    $config = array_merge_recursive(
        parse_ini_file($conf_dir.'base.ini'),
        parse_ini_file($conf_dir.'client.ini')
    );
    // Store it serialized
    file_put_contents($ini_cache, serialize($config));
} else {
    $config = deserialize(file_get_contents($ini_cache));
}

您可以通过此方式获得更多创意,但实质上,这允许您以任何方式存储/生成配置。如果您不想在每次更改时删除序列化缓存,可以添加atime支票:

<?php

define('CACHE_DIR', '/tmp/');
// where 'http' is a path part that directly follows the app root, and will always
// be below where this file is called from.

$ini_cache  = CACHE_DIR.'config.ser';
$conf_dir = dirname(__FILE__);

$config = array();

if(file_exists($ini_cache)) {
    $client_stat = stat($conf_dir.'client.ini');
    $cache_stat = stat($ini_cache);

    if($client_stat['atime'] < $cache_stat['atime']) {
        $config = deserialize(file_get_contents($ini_cache));
    }
}

if(empty($config)) {
    // Build your config in any way you wish.
    $config = array_merge_recursive(
        parse_ini_file($conf_dir.'base.ini'),
        parse_ini_file($conf_dir.'client.ini')
    );
    // Store it serialized
    file_put_contents($ini_cache, serialize($config));
}

使用序列化方法,您可以使用您喜欢的$config生成方案,如果您使用PHP,您甚至可以获得真正的创意/复杂性,并且页面的缓存命中率可以忽略不计