【问题标题】:How do you isolate nested dependencies in PHP?如何隔离 PHP 中的嵌套依赖项?
【发布时间】:2018-07-18 13:44:39
【问题描述】:

我有三个文件,foo.phpbar.phpbaz.php,每个文件都由include接下来,如下:

foo.php

<?php

$missile_launch_codes = [
    'missileA' => '...',
    'missileB' => '...',
    'missileC' => '...'
];

bar.php

<?php

require('foo.php');

function try_to_launch($launch_code) {
    ...
}

function launch_missile($missile_name) {
    if (in_array($missile_name, $missile_launch_codes)) {
        return try_to_launch($missile_launch_codes[$missile_name]);
    } else {
        return false;
    }
}

baz.php

require('bar.php')   

if (...) {
    launch_missile(...);
}

baz.php 文件需要能够使用launch_missile(),但绝对不能访问$missile_launch_codes。我如何隔离从 foo.php 导入的 $missile_launch_codes 以防止它们落入 baz.php 之手?

【问题讨论】:

标签: php dependencies dependency-management isolation


【解决方案1】:

如果我是你,你需要在 OOP 中实现。可以这样操作...

foo.php:

class Foo {
    protected function missile_launch_codes() {
         return [
           'missileA' => '...',
           'missileB' => '...',
           'missileC' => '...'
         ];
    }
}

bar.php:

class Bar extends Foo {
   public function try_to_launch($launch_code) {
      ...
   }

   public function launch_missile($missile_name) {
      if (in_array($missile_name, $missile_launch_codes)) {
         return try_to_launch($this->missile_launch_codes[$missile_name]);
      } else {
         return false;
      }
   }
}

baz.php

class Baz extends Bar {
   // you cannot access missile_launch_codes() here
}

尝试更多地研究 OOP 以了解更多我在这里想说的内容..

【讨论】:

    【解决方案2】:

    你可以做的大概就是这种Object-oriented方式:

    Missile.php

    Class Missile
    {
    
        private $missile_launch_codes = [
            'missileA' => '...',
            'missileB' => '...',
            'missileC' => '...'
        ];
    
        private function try_to_launch($launch_code) {
            ...
        }
    
        public function launch_missile($missile_name) {
            if (in_array($missile_name, $this->missile_launch_codes)) {
                return $this->try_to_launch($this->missile_launch_codes[$missile_name]);
            } else {
                return false;
            }
        }
    
    }
    

    Launch.php

    include('Missile.php');
    Class Launch extends Missile
    {
        if (...) {
            $this->launch_missile(...);
        }
    }
    

    这里,$missile_launch_codes 只能被 Missile 类访问,因为它被声明为 private

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多