Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / передача определённых параметров статическим классом / 8 сообщений из 8, страница 1 из 1
05.01.2012, 08:15
    #37602725
Пионэр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передача определённых параметров статическим классом
Если нужно получить запрос от строго определённого источника, достаточно этот источник указать:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
class getter {

	function test($id = 0){
    
		$test = new tester();
		return $test->get_subj($this, $id);
	}

	static function static_test($id = 0){

		$test = new tester();
		return $test->get_subj(self, $id);
	}
}



class tester{

	function get_subj(getter $obj, $id){
		
		// вычисление $subj по $id
		...
		return (isset($subj)) ? true : false;
	}	
}




То есть, в данном случае запрос будет выполнен:

Код: php
1.
2.
  $G = new getter();
  $G->test(123);



Если же метод вызван как статический, то передать экземпляр таким же макаром уже не получится..
Код: php
1.
2.
3.
4.
5.
 
  getter::static_test(123);

// Catchable fatal error: 
// Argument 1 passed to tester::get_subj() must be an instance of getter, string given, called in bla bla bla



Собственно догадываюсь, что сие ограничение непреодолимо, но мало ли :)
Существует ли возможность проверять параметры, передаваемые статическим классом?
...
Рейтинг: 0 / 0
05.01.2012, 09:27
    #37602740
Пионэр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передача определённых параметров статическим классом
Один хак придумал: создать и передать экземпляр класса.
А для пущей уверенности, добавил валидацию - переменную, которую вне класса изменить нельзя (ибо передать экземпляр можно откуда угодно).

Переменная переопределяется в вызывающем методе, делается вызов, после чего переменной опять возвращается значение:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
class getter {

	private static $name = 'Anybody';
	private static $instance;  // object instance
	public static function inst(){
		if (self::$instance === null) {self::$instance = new self;}
		return self::$instance;
	}

	function test($id = 0){

		$test = new tester();
		return $test->get_subj($this, $id);
	}

	static function static_test($id = 0){

		self::$name = 'Pioner'; // открываем доступ

		$test = new tester();
		$re = $test->get_subj(self::inst(), $id);

		self::$name = 'GoHome'; // закрываем доступ

		return $re;
	}

	function myName(){return self::$name;}

}



class tester{

	function get_subj(getter $obj, $id){

		if($obj->myName() != 'Pioner'){
			exit('Уважаемый <b>'.$obj->myName().'</b>, посторонним В!!');
		}

		echo 'Добро пожаловать, <b>'.$obj->myName().'</b>!!';
		// вычисление $subj по $id
		//...
		return (isset($subj)) ? true : false;
	}
}
...
Рейтинг: 0 / 0
05.01.2012, 12:19
    #37602847
как то так
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передача определённых параметров статическим классом
авторА для пущей уверенности, добавил валидацию - переменную, которую вне класса изменить нельзя (ибо передать экземпляр можно откуда угодно).
Переменная переопределяется в вызывающем методе, делается вызов, после чего переменной опять возвращается значение:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
class getter 
{
	protected static $_instance;

	final private static function getInstance()
        {
		if ( !static::$_instance )
                {
                         static::$_instance = new static;
                }
		return static::$_instance;
	}

	public function test( $id = 0 )
        {
		$test = new tester();
		return $test->get_subj( $this, $id );
	}

	public static function static_test( $id = 0 )
        {		
		$test = new tester();		
		return $test->get_subj( self::getInstance(), $id );
	}
}

class tester
{
	public function get_subj( getter $obj, $id )
        {				
		// вычисление $subj по $id
		//...
		return isset( $subj );
	}
}


+ не уверен, что нельзя передать параметром напрямую в статике, однако пробовать лень!

Успехов!
...
Рейтинг: 0 / 0
05.01.2012, 12:54
    #37602886
Пионэр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передача определённых параметров статическим классом
те же яйца :) разница только в названии метода, вызывающего экземпляр класса
Код: plaintext
getInstance() vs inst()


не уверен, что нельзя передать параметром напрямую в статике,

в том и дело, что не передаётся, ибо в статике не создаётся экземпляр класса

википедия
Использовать статические функции класса можно, не создавая самого экземпляра класса.


если передать статичный "экземпляр", то на самом деле будет передана строка.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
        // запрашиваем из статического класса
        get_subj(self, $id)


	function get_subj($obj, $id){

		echo $obj; // выведет слово "self"
	}
...
Рейтинг: 0 / 0
05.01.2012, 16:09
    #37603202
как то так
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передача определённых параметров статическим классом
авторте же яйца :) разница только в названии метода, вызывающего экземпляр класса
getInstance() vs inst()
почитай про модификаторы доступа - довольно поучительно... может тогда
авторА для пущей уверенности, добавил валидацию - переменную, которую вне класса изменить нельзя
покажется бредом ;)
...
Рейтинг: 0 / 0
06.01.2012, 02:00
    #37603731
Пионэр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передача определённых параметров статическим классом
разница между твоим и моим примером в том, что у в меня инициирующий метод назначен как Паблик , а у тебя как Приват , а точнее
Код: php
1.
final private static function getInstance()



В данном случае защищать метод getInstance() бесполезно, даже если написать большими красными буквами "БУ!"

Я же упоминал, что "передать экземпляр можно откуда угодно".

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class getter {

	private static $instance;
	final private static function getInstance(){
	
		if (self::$instance === null) {self::$instance = new self;}
		return self::$instance;
	}

}


##    обходим ограничения, создав экземпляр без обращения к getInstance()

	$oTest = new tester();
	$oHuck = new getter(); // о Боже! и что теперь будет?!

	$result = $oTest->get_subj($oHuck, 'what the fuck?'); // проглотит и не подавится
...
Рейтинг: 0 / 0
06.01.2012, 11:01
    #37603866
как то так
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передача определённых параметров статическим классом
Код: php
1.
2.
3.
4.
$oTest = new tester();
$oHuck = new getter(); // о Боже! и что теперь будет?!

$result = $oTest->get_subj($oHuck, 'what the fuck?'); // проглотит и не подавится


будет именно то, что ты описал в методе get_subj - в чём проблема?!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
06.10.2013, 02:54
    #38417927
guest349343487
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передача определённых параметров статическим классом
class getter
{
....

public static function static_test( $id = 0 )
{
$test = new tester();
return $test->get_subj( static::getInstance(), $id );
}
}

php5.3+
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / передача определённых параметров статическим классом / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]