$this в подфункциях метода

vk

Новичок
$this в подфункциях метода

Возникла проблема при работе с классами в php5.
Везде искал, но ответа на данный вопрос не нашел.
Итак, код:
PHP:
<?php
class TestClass{
	private $Var='';
	
	function TestMethod(){
	
		function Set($str){
			$this->Var=$str;
		}
		Set('qwe');
	}
}
$t=new TestClass();
$t->TestMethod();
?>
При выполнении получаем ошибку - Fatal error: Using $this when not in object context in /.../test.php on line 8
Как с этим бороться?
 

Духовность™

Продвинутый новичок
1. Нужно писать не Set('qwe'); , а $this->Set('qwe');
2. За метод, объявленный в методе надо руки оторвать.
 

craz

Нестандартное звание
function TestMethod(){

function Set($str){
$this->Var=$str;
}
Set('qwe');
}
я бы для надежности в функции TestMethod() класс какой нить объявил, а то что-то слишком простая у вас логика.

-~{}~ 27.04.10 15:34:

1. Нужно писать не Set('qwe'); , а $this->Set('qwe');
не будет работать вы бы проверили хоть
Fatal error: Call to undefined method TestClass::Set()
 

vk

Новичок
triumvirat
1. Боюсь вы не правы
2. Целью является не создание метода внутри метода, а создание в методе функции, которая на самом деле вызывается (внутри метода) несколько раз.

craz
Не издевайтесь :) Одно из главных предназначений функций - сокращение кода, замена собой повторяющихся кусков кода.

Это лишь пример, на котором я показал принцип работы моего скрипта. И, разумеется, там все немного сложнеее :)
 

craz

Нестандартное звание
Не издевайтесь Одно из главных предназначений функций - сокращение кода, замена собой повторяющихся кусков кода.

Это лишь пример, на котором я показал принцип работы моего скрипта. И, разумеется, там все немного сложнеее
без проблем беольше не стану, хотя вы над собой помоему больше издеваетесь, почему эту функцию вверх не вынести в контекст класса?
class TestClass{
public $Var='';

function TestMethod(){
$this->Set('qwe');
}
function Set($str){
$this->Var=$str;
}
}
$t=new TestClass();
$t->TestMethod();
 

Духовность™

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

vk

Новичок
craz
Эмм... Ну как вариант конечно можно.
Правда создастся метода класса вместо локальной функции - не очень красиво.
Ну да ладно. По другому похоже нельзя.
 

mustafa

Новичок
>Правда создастся метода класса вместо локальной функции - не очень красиво.
а что есть где то по-другому?
 

vk

Новичок
triumvirat
абсурдно?
То есть, по вашему мнению объявлять функцию внутри функции (я не про php и классы - а вообще) - глупо и совершенно не нужно?

Функция Set мне не нужна будет нигде, кроме как в методе TestMethod. Ни в других методах, ни снаружи класса. Включить данную функцию в метод класса я посчитал логичным. А что php такие "извращения" не поддерживает, ну то уж...
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
vk
если она тебе нужна только в методе класса, то и выносить видимо в нее много кода не надо, так что имхо оно того не стоит чтобы так пытаться извратиться.
 

craz

Нестандартное звание
можно посмотреть на вашу реальную функцию Set?

у вас архитектура поплыла, вы видимо с какого то другого языка на php пересаживаетесь.
 

soines

Новичок
А что php такие "извращения" не поддерживает, ну то уж...
Что именно он не поддерживает? Использование $this в вашем методе? Так подумайте об области видимости.
 

craz

Нестандартное звание
Что именно он не поддерживает? Использование $this в вашем методе? Так подумайте об области видимости.
уже не суть важна область видимости.
 

Духовность™

Продвинутый новичок
То есть, по вашему мнению объявлять функцию внутри функции (я не про php и классы - а вообще) - глупо и совершенно не нужно?
именно так. это усложняет код в разы, путает разработчика. даже я, пишущий на php много лет пришел в непонимание от написанного вами. это плохой стиль кода.

Функция Set мне не нужна будет нигде, кроме как в методе TestMethod
функция set не нужна вам нигде, кроме класса. вот и сделайте её private частью класса, а не пытайтесь спрятать её в методе.
 

Fortop

Новичок
А я бывает прячу в методах :)
Иногда вполне удобно.

Вопросы $this, как и сказал soines вполне решаются, если подумать об областях видимости и о том, что же такое мы объявляем внутри метода :)
 

craz

Нестандартное звание
Автор оригинала: Fortop
А я бывает прячу в методах :)
Иногда вполне удобно.

Вопросы $this, как и сказал soines вполне решаются, если подумать об областях видимости и о том, что же такое мы объявляем внутри метода :)
можно пример, правда интересно как это решается

-~{}~ 27.04.10 16:36:

функция set не нужна вам нигде, кроме класса. вот и сделайте её private частью класса, а не пытайтесь спрятать её в методе.
+1

-~{}~ 27.04.10 16:39:

видимо вот таким извратом?


class TestClass{
public $Var='';

function TestMethod(){

function Set($str,$th){
$th->Var=$str;
return $th->Var;
}
Set('qwe',$this);
return $this->Var;
}

}
$t=new TestClass();
echo $t->TestMethod();
 

craz

Нестандартное звание
ну я в курсе, кто нить в продакшене ей(версией 5.3) пользуется? уже? или это флуд?
 
Сверху