PHP 5.2 Virtual-gibi statik yöntemler

4 Cevap php

İşte benim durum: Ben şöyle bir PHP temel sınıf vardır:

class Table {
  static $table_name = "table";
  public function selectAllSQL(){
    return "SELECT * FROM " . self::$table_name;
  }
}

Ve bu gibi bir alt:

class MyTable extends Table {
  static $table_name = "my_table";
}

Ne yazık ki, ne zaman:

MyTable::selectAllSQL()

Alıyorum:

"SELECT * FROM table"

yerine benim arzu edilen sonucu,

"SELECT * FROM my_table"

Bu late static bindings kullanarak php 5.3 yapılabilir gibi görünüyor, ama ben PHP 5.2.x bu davranışı gerçekleştirmek için herhangi bir yolu var mı?

4 Cevap

Gerçekten değil. LSB 5.3 eklendi yüzden. Destekleme singleton ile birlikte, bu yerde, gitmek yoludur.

Neden sınıfın örneğini bir seçenektir!

<?php
abstract class Table {
	protected $table_name;
	public function selectAllSQL() {
		return 'SELECT * FROM ' . $this->table_name;
	}
}

class MyTable extends Table {
	protected $table_name = 'my_table';
}

$my_table = new MyTable();
echo $my_table->selectAllSQL(); // Will output "SELECT * FROM my_table"

Eğer reimplementation PHP

<?php
abstract class Table {
	protected static $table_name = 'table';
	public static function selectAllSQL() {
		return self::selectAllSQLTable(self::$table_name);
	}
	public static function selectAllSQLTable($table) {
		return 'SELECT * FROM ' . $table;
	}
}

class MyTable extends Table {
	protected static $table_name = 'my_table';
	public static function selectAllSQL() {
		return self::selectAllSQLTable(self::$table_name);
	}
}

class MyOtherTable extends Table {
	protected static $table_name = 'my_other_table';
	public static function selectAllSQL() {
		return self::selectAllSQLTable(self::$table_name);
	}
}

echo MyTable::selectAllSQL(); // Will output "SELECT * FROM my_table"
echo MyOtherTable::selectAllSQL(); // Will output "SELECT * FROM my_other_table"

Bu sınıfları örneğini için bir seçenek olurdu?

Yeh late static binding is the way karşı go. Maybe you are on PHP 5.3 by now. Here is how it should look then:

Değişim

class Table {
  static $table_name = "table";
  public function selectAllSQL(){
    return "SELECT * FROM " . self::$table_name;
  }
}

karşı

class Table {
  static $table_name = "table";
  public function selectAllSQL(){
    return "SELECT * FROM " . static::$table_name;
  }
}