Как сделать, PHP вложил класс или вложил методы?

Если вы пытаетесь сопоставить один полный IP-адрес с каждым оператором if-else, вы можете просто использовать условное выражение ==. Например:

if "172.16.200.2" == ip:
    print ("200.2")
## etc..

Если вы хотите масштабировать это до еще большего количества IP-адресов без необходимости писать тонны операторов if-else, вы можете использовать словарь.

ip_dict = {
    "1.1.1.1": "cloudflare!",
    "172.16.200.2": "200.2",
    "172.16.200.21": "200.21",
    "192.168.0.1": "0.1",
    "etc...": "etc..."
}

## use a try-except block here just in case the ip address is not in your dictionary - avoid error and pass
try:
    print (ip_dict[ip])
except:
    pass

Надеюсь, это поможет!

12
задан David Grant 10 February 2009 в 18:15
поделиться

3 ответа

Имейте эхо-сигналы методов с методами, описанными, и Вы получаете то, что Вы после.

Так, пока $DB объект, который имеет a comments()- метод, та часть допустима. Если это comments() возвращает объект, который имеет id()- метод, та часть допустима, также. Затем id() потребности возвратить объект, который имеет limit()- метод.

В Вашем особом случае Вы могли бы хотеть сделать что-то вроде этого:

class DB {
  public function comments() {
    // do preparations that make the object select the "comments"-table...
    return $this;
  }

  public function id($string) {
    // handle this too...
    return $this;
  }

  public function limit($int) {
    // also this
    return $this;
  }

  public function execute() {
    $success = try_to_execute_accumulated_db_commands();
    return $success;
  }
}

$DB = new DB();
$DB->comments()->id(" > 3")->limit(10);

В моем примере каждый метод (также не изображенный здесь) возвратил бы сам объект, так, чтобы команды могли быть объединены в цепочку вместе. Когда конструкция запроса базы данных сделана, Вы на самом деле оцениваете запрос путем вызова execute() это (в моем случае) возвратило бы булевскую переменную, которая представит успех выполнения базы данных.

Пользователь nickohm предположил, что это называют быстрым интерфейсом. Я должен признать, что это - новый термин для меня, но это говорит, вероятно, больше моего знания, чем использование термина. ("Я просто пишу код, Вы знаете..."),

Примечание: $this 'волшебная' переменная, которая указывает на в настоящее время активный объект. Как следует из названия это просто возвращает себя как возвращаемое значение для метода.

17
ответ дан 2 December 2019 в 05:42
поделиться

Стандартная конвенция для этого состоит в том, чтобы возвратить экземпляр $this в конце каждого вызова метода. Таким образом, при возврате вызывающей стороне мы затем просто ссылаемся на другой вызов метода.

class Foo
{
  public function do_something()
  { 
    return $this; 
  }

 public function do_something_else() 
 {
   return $this; 
  }
}

$foo = new Foo();
$foo->do_something()->do_something_else();
10
ответ дан 2 December 2019 в 05:42
поделиться

Простое для реализации метода для запущения Вас могло бы пойти как:

class db
{
  public function __call($function, $arguments)
  {
    switch($function) {
      // implement table handling here
      case 'user':
        //do something
        return $something;
        break;
    }
  }
}

В зависимости от того, хотите ли Вы пойти сложные, но твердый или простой, но менее гибкий Вы могли бы реализовать две различных стратегии. Простая стратегия могла бы пойти как так:

class db
{

  protected $operatingTable;

  public function limit($limitNumber)
  {
    return $this->executeQuery("SELECT * FROM ".$this->operatingTable." LIMIT ".$limitNumber); // where executeQuery is a function that runs a query
  }

  public function __call($function, $arguments)
  {
    switch($function) {
      // implement table handling here
      case 'user':
        $this->operatingTable='user'; // alternately, but less secure: $this->operatingTable=$function;
        return $this;
        break;
    }
  }
}

Поочередно, но более мощный:

class db
{
  protected $operatingTable;

  public function limit($limitNumber)
  {
    return $this->executeQuery("SELECT * FROM ".$this->operatingTable." LIMIT ".$limitNumber); // where executeQuery is a function that runs a query
  }

  public function __call($function, $arguments)
  {
    switch($function) {
      // implement table handling here
      case 'user':
        $user = new user($this); // pass in the database to the object, so the table object can have a reference to the db
        return $user;
        break;
    }
  }
}

class baseTableClass
{
  protected $db; // an instance of class db

  function limit($limitNumber)
  {
    $db->execute($aStatementDerivedFromThisClassesInformation); // execute a sql command, based on information about the table in the class
  }

}

class user extends baseTableClass
{
  public function __construct($db) {
    $this->db = $db;
  }
}

Вы получаете идею. Или перегрузка, объект дб, или создают основной объект дб и объекты таблицы, помещая большую часть аналитики в объектах таблицы, гарантируя, что при создании объект таблицы хранит ссылку на объект дб

0
ответ дан 2 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: