修改建议

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

变量作用域问题

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

  1. <?php
  2. if(! defined ('IN_DISCUZ')) {
  3. exit ('Access Denied');
  4. }
  5. $data = C::t('#myaddon#mytable')->fetch_my_data ( );
  6. include template ('myaddon:mytemplate');

模板 myaddon/mytemplate.htm:

  1. {template common/header}
  2. {loop $data $key $value}
  3. {$key} = {$value}<br />
  4. {/loop}
  5. {template common/footer}

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

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

  1. <?php
  2. if(! defined ('IN_DISCUZ')) {
  3. exit ('Access Denied');
  4. }
  5. // myaddon.core.php 是原来的 myaddon.inc.php
  6. require_once './myaddon.core.php';
  7. include template ('myaddon:mytemplate');

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

  1. <?php
  2. if(! defined ('IN_DISCUZ')) {
  3. exit ('Access Denied');
  4. }
  5. // 把 $data 作为全局变量
  6. global $data;
  7. $data = C::t('#myaddon#mytable')->fetch_my_data ( );
  8. // 引入模板已经转移到新的 myaddon.inc.php 中实现
  9. // include template ('myaddon:mytemplate');

类的改造

嵌入点等需要使用类。

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

  1. <?php
  2. if(! defined ('IN_DISCUZ')) {
  3. exit ('Access Denied');
  4. }
  5. class plugin_myhook {
  6. public function mymethod1($var1, $var2) {
  7. // 实现代码
  8. }
  9. public function global_header() {
  10. $this->mymethod1(1, 2);
  11. }
  12. }

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

  1. <?php
  2. if(! defined ('IN_DISCUZ')) {
  3. exit ('Access Denied');
  4. }
  5. function plugin_myhook_mymethod1($var1, $var2) {
  6. // 实现代码
  7. }

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

  1. <?php
  2. if(! defined ('IN_DISCUZ')) {
  3. exit ('Access Denied');
  4. }
  5. require_once './myhook.core.php';
  6. class plugin_myhook {
  7. // 删除 mymethod1() 方法
  8. public function global_header() {
  9. // 改为调用函数
  10. plugin_myhook_mymethod1(1, 2);
  11. }
  12. }

其它建议

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

原文: http://mfenc-manual.mydoc.io/?t=41522