Ошибка __PHP_Incomplete_Class

Mondain

Новичок
Ошибка __PHP_Incomplete_Class

Скрипт выдаёт ошибку:
PHP:
Catchable fatal error: Object of class __PHP_Incomplete_Class could not be converted to string in C:\WebServer\www\language-class\language.php on line 36
Класс:
PHP:
<?php

class Language {
	public function __construct ($directory, $session = null) {
		if (!empty ($directory)) {
			if (is_dir ($directory)) {
				$this->directory = $directory;
			} else {
				$this->fatalError ('Language Files folder doesn\'t exist');
			}
		} else {
			$this->directory = '';
		}

		if (isset ($_GET['setLanguage']) && ($_GET['setLanguage'] != $session)) {
			$this->setLanguage (strtolower ($_GET['setLanguage']));
		} else {
			if (isset ($session)) {
				$this->language = $session;
			} else {
				$accept_language = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
				$prefered_language = explode (',', $accept_language);
				$prefered_language = (@eregi ('en-', $prefered_language[0])) ? 'en' : $prefered_language[0];
				$this->language = $prefered_language;
			}
		}

		$this->loadLanguageFile ();
	}

	private function loadLanguageFile () {
		if (!isset ($this->language)) {
			$this->fatalError ('No language selected');
		}

		if (!file_exists ($this->directory . $this->language . '.php')) {
			if ($this->language != 'en') {
				$this->language = 'en';
				$this->loadLanguageFile ();
			} else {
				$this->fatalError ('Languagefile not found:<br />' . $this->directory . $this->language . '.php');
			}
		} else {
			require $this->directory . $this->language . '.php';

			if (isset ($array)) {
				$this->array = $array;
				$this->loaded = true;
			} else {
				$this->fatalError ('Language file does not contain $array');
			}
		}
	}

	public function get ($identifier) {
		if (in_array ($identifier, array_keys ($this->array))) {
			return $this->array[$identifier];
		} else {
			return '<span style="color: red">' . $identifier . '</span>';
		}
	}

	public function setLanguage ($lang) {
		$this->language = $lang;
		$this->loadLanguageFile ();

		if (!$this->loaded) {
			$this->fatalError ('Language not found');
		} else {
			$_SESSION['language'] = $lang;
		}
	}

	private function fatalError ($error) {
		//ob_get_clean();

		echo '<body style="background: #F5F5F5;">
	<div style="position: absolute; left: 50%; width: 600px; background: #F9F9F9; margin-left: -300px; border: 1px dashed #76D9EE; padding: 2px;">
		<div style="border: 1px solid #AAAAAA; background: #FFFFFF; font: 11px Tahoma; padding: 6px;">
			<h3 style="margin: 0; font: 14px Arial; font-weight: bold;">Language: Fatal Error</h3>
			' . $error . '
		</div>
	</div>
</body>';
		exit;
	}
}

?>
Пример:
PHP:
<?php

	session_start ();
	require 'language.php';
	$language = new Language ('languages/', $_SESSION['language']);

?>
<html>
<body style="font: 10px Verdana;">
<?php echo $language->get ('say_hello'); ?>
</body>

<br />
<br />
<strong>
Switch language: <a href="?setLanguage=nl">Dutch</a> - <a href="?setLanguage=es">Spanish</a> - <a href="?setLanguage=en">English</a>
</strong>
</html>
Не могу никак решить. В чём проблема?
 

Beavis

Banned
попробуй поменять местами строчки
PHP:
    session_start ();
    require 'language.php';
 

O1&g

Новичок
Re: Ошибка __PHP_Incomplete_Class

Автор оригинала: Mondain
Скрипт выдаёт ошибку:
PHP:
Catchable fatal error: Object of class __PHP_Incomplete_Class could not be converted to string in C:\WebServer\www\language-class\language.php on line 36
Класс:
PHP:
<?php
class Language {
}
?>
Что у тебя в 36 строке твоего класса?
 

Mondain

Новичок
PHP:
		if (!file_exists ($this->directory . $this->language . '.php')) { <-- 36 строка
			if ($this->language != 'en') {
				$this->language = 'en';
				$this->loadLanguageFile ();
			} else {
				$this->fatalError ('Languagefile not found:<br />' . $this->directory . $this->language . '.php');
			}
		} else {
			require $this->directory . $this->language . '.php';

			if (isset ($array)) {
				$this->array = $array;
				$this->loaded = true;
			} else {
				$this->fatalError ('Language file does not contain $array');
			}
		}
 

dimagolov

Новичок
что-то мне подсказывает, что совпадение имени класса Language и свойсива в нем language (кстати, свойства не декларируются почему-то) доводит до беды.

-~{}~ 08.12.09 13:41:

а какая весия php?
 

Beavis

Banned
ну тут две проблемы: первая - объект класса Language попадает в сессию, а вторая - что сессия стартует раньше чем объявляется класс Language и получается в итоге __PHP_Incomplete_Class
 

dimagolov

Новичок
Beavis, проблема в том, что каким-то хреном в $this->language (и в сессию) попал объект, а не строка, как должно быть.

Mondain, браузер перепускал, чтобы получить новый файл сессии, без ошибки?
 

Beavis

Banned
Автор оригинала: dimagolov
Beavis, проблема в том, что каким-то хреном в $this->language (и в сессию) попал объект, а не строка, как должно быть.
это кстати не первый раз такое, сам сталкивался... правда мне было проще переименовать ключ в сессии чем разбираться в чем дело)
 

fixxxer

К.О.
Партнер клуба
[mod_telepat on]
есть такое подозрение что включены register globals и в сессию попадает то что там быть не должно (т.е. $language=... переопределяет $_SESSION['language'])
 

Mondain

Новичок
Отключил register_globals и проблема решилась :) спасибо всем за помощь.
 

GooG2e

Новичок
Сорри, что поднимаю давнюю тему, но есть аналогичная проблема - перенес сайт со своего компа(php 5.3.5) на хостинг(php 5.2.6) и появилась такая ошибка:
PHP:
Fatal error: Cannot use object of type __PHP_Incomplete_Class as array in /home/virtwww/w_wsro_2382ef3e/http/captcha.php on line 33
Причем появляется она не сразу, а только через пару обновлений(т.е. стираю сессию через куки код пару раз срабатывает, а потом еррор)

Собственно код
PHP:
<?php
session_start();
function g($name){
	return $GLOBALS['class'][$name];	
}
function s($name,$value){
	$GLOBALS['class'][$name]=$value;
}
//Ассоциации с нужными функциями классов
function get($type,$sub){
	return g('config')->get($type,$sub);
}
include 'class/config.php';
include 'class/mysql.php';
s('config',new config());
s('mysql',new mysql());
g('config')->load_param();
include "./class/captcha/class.captcha.php";
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: post-check=0,pre-check=0", false);
header("Cache-Control: max-age=0", false);
header("Pragma: no-cache");
$length=rand(get('captcha','min_len'),get('captcha','max_len'));
$chars=get('captcha','chars');
$string='';
for($i=0;$i<$length;$i++){
	$string.=$chars{rand(0,strlen($chars)-1)};
	
}
$id=$_GET['id'];
$_SESSION['captcha'][$id]=md5($string);
$colors=get('captcha','colors');
$colors=explode(';',$colors);
$dir=opendir('./class/captcha/fonts');
$files=array();
while($filename=readdir($dir)){
	if($filename!='.' && $filename!='..' && $filename!='.svn'){
		$files[]=$filename;
	}
}
//$captcha = new Captcha ( $string, "./class/captcha/fonts/".$files[rand(0,count($files)-1)], $colors[rand(0,count($colors)-1)] );
$captcha=new Captcha();
$colors=$colors[rand(0,count($colors)-1)];
$files="./class/captcha/fonts/".$files[rand(0,count($files)-1)];
$bgcolor=get('captcha','background');
$captcha->setBGColor(substr($bgcolor,0,3),substr($bgcolor,3,3),substr($bgcolor,6,3));
$captcha->setTextColor(substr($colors,0,3),substr($colors,3,3),substr($colors,6,3));
$captcha->setSize(get('captcha','width'),get('captcha','height')); 
$captcha->setFont($files);
$captcha->setText($string);
$captcha->showImage();
Ошибка на строчку:
PHP:
$_SESSION['captcha'][$id]=md5($string);
Есть подозрения, что ошибка из-за того, что класс в переменной $captcha и пистаь пытаюсь в $_SESSION['captcha']
Подскажите что можно сделать?
 
Сверху