修改建议

优质
小牛编辑
116浏览
2023-12-01

下面列出一些 Discuz! 应用常见的代码并给出相关的修改建议。

变量作用域问题

文件 myaddon.inc.php,该文件加密:

<?php
    if(! defined ('IN_DISCUZ')) {
        exit ('Access Denied');
    }

    $data = C::t('#myaddon#mytable')->fetch_my_data ( );

    include template ('myaddon:mytemplate');

模板 myaddon/mytemplate.htm:

{template common/header}

{loop $data $key $value}
    {$key} = {$value}<br />
{/loop}

{template common/footer}

不兼容的地方在:myaddon.inc.php 加密后,变量 $data 是函数外作用域的局部变量,通过 include 引入的模板代码属于引入代码作用域,这是两个不同的作用域,在模板中无法访问 $data

修改方法为建立一个新的 myaddon.inc.php,文件不加密,内容为:

<?php
    if(! defined ('IN_DISCUZ')) {
        exit ('Access Denied');
    }

    // myaddon.core.php 是原来的 myaddon.inc.php
    require_once './myaddon.core.php';

    include template ('myaddon:mytemplate');

而原来的 myaddon.inc.php 改名为 myaddon.core.php,该文件加密,需要做修改:

<?php
    if(! defined ('IN_DISCUZ')) {
        exit ('Access Denied');
    }

    // 把 $data 作为全局变量
    global $data;

    $data = C::t('#myaddon#mytable')->fetch_my_data ( );

    // 引入模板已经转移到新的 myaddon.inc.php 中实现
    // include template ('myaddon:mytemplate');

类的改造

嵌入点等需要使用类。

文件 myhook.class.php,内容如下:

<?php
    if(! defined ('IN_DISCUZ')) {
        exit ('Access Denied');
    }

    class plugin_myhook {
        public function mymethod1($var1, $var2) {
            // 实现代码
        }

        public function global_header() {
            $this->mymethod1(1, 2);
        }
    }

可以将其分为两个文件,新建 myhook.core.php,该文件加密:

<?php
    if(! defined ('IN_DISCUZ')) {
        exit ('Access Denied');
    }

    function plugin_myhook_mymethod1($var1, $var2) {
        // 实现代码
    }

而文件 myhook.class.php 做如下改造,文件不加密:

<?php
    if(! defined ('IN_DISCUZ')) {
        exit ('Access Denied');
    }

    require_once './myhook.core.php';

    class plugin_myhook {
        // 删除 mymethod1() 方法

        public function global_header() {
            // 改为调用函数
            plugin_myhook_mymethod1(1, 2);
        }
    }

其它建议

作用域问题是最常见的问题,因而,魔方加密建议您上传函数库(即文件中只包含)进行加密。