繁体   English   中英

如何隔离PHP中的嵌套依赖关系?

[英]How do you isolate nested dependencies in PHP?

我有三个文件foo.phpbar.phpbaz.php ,每个文件都include “ d by next”,如下所示:

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 如何将我隔离$missile_launch_codesfoo.php进口,让他们走出baz.php的手呢?

您可能可以做的就是这种面向对象的方式:

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

如果我是您,则需要在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的更多信息,以了解我在这里要说的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM