Catchable fatal error: could not be converted to string
Quote:
Catchable fatal error: Object of class PclZip could not be converted to string in C:\xampp\htdocs\xampp\AutoDir\index.php on line 59
Iemand enig idee hoe ik dit eindelijk opgelost krijg?
Code (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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<html>
<head>
<?php require_once("filesize_lib.php"); ?>
<?php require_once("pclzip.lib.php");?>
<style type="text/css">
.readme{
width:500px;
height:150px;
background: silver;
overflow-x: hidden;
overflow-y: scroll;
}
</style>
</head>
<body>
<?php
$readme = "/readme.txt";
$download = "downloads";
// Openen
$dir = new DirectoryIterator('.');
// Doorlopen
?>
<table width="960px" border="1px"><tr><td width="165px"><strong>Name</strong></td><td width="50px"><strong>Type</strong></td><td width="70px"><strong>Size</strong></td><td width="125px"><strong>Last Modified</strong></td><td><strong>Short description</strong></td><td width="50px"><strong>Download</strong></td></tr>
<?php
$zip = new PclZip("tmp/archief.zip");
foreach ($dir as $file)
{
if (! $file->isDot()
&& $file != ".."
&& $file != "index.php"
&& $file != "filesize_lib.php"
&& $file != "downloads"
)
{ ?><tr><td><?php
echo '<a href="'.$file.'">'.$file.'</a>';
?></td><td><?php
echo filetype($file);
?></td><td><?php
echo fileORdirSize($file).'<br/>';
?></td><td><?php
echo date("M j, Y", filemtime($file));
?></td><?php
if (filetype($file) == "dir"){
?>
<td><div class="readme"><?php
echo file_get_contents($file.$readme);
?></div></td><?php
} else {
?><td>Files don't have descriptions, but can be tested directly from this page.</td><?php
}
?><td><?php
if($zip->add($file->getFilename()) == 0)
die("Error : " . $zip->errorInfo(false));
echo '<a href="'.$zip.'">'.$zip.'</a>';
?></td></tr><?php
}
}
?>
</table>
</body>
</html>
<head>
<?php require_once("filesize_lib.php"); ?>
<?php require_once("pclzip.lib.php");?>
<style type="text/css">
.readme{
width:500px;
height:150px;
background: silver;
overflow-x: hidden;
overflow-y: scroll;
}
</style>
</head>
<body>
<?php
$readme = "/readme.txt";
$download = "downloads";
// Openen
$dir = new DirectoryIterator('.');
// Doorlopen
?>
<table width="960px" border="1px"><tr><td width="165px"><strong>Name</strong></td><td width="50px"><strong>Type</strong></td><td width="70px"><strong>Size</strong></td><td width="125px"><strong>Last Modified</strong></td><td><strong>Short description</strong></td><td width="50px"><strong>Download</strong></td></tr>
<?php
$zip = new PclZip("tmp/archief.zip");
foreach ($dir as $file)
{
if (! $file->isDot()
&& $file != ".."
&& $file != "index.php"
&& $file != "filesize_lib.php"
&& $file != "downloads"
)
{ ?><tr><td><?php
echo '<a href="'.$file.'">'.$file.'</a>';
?></td><td><?php
echo filetype($file);
?></td><td><?php
echo fileORdirSize($file).'<br/>';
?></td><td><?php
echo date("M j, Y", filemtime($file));
?></td><?php
if (filetype($file) == "dir"){
?>
<td><div class="readme"><?php
echo file_get_contents($file.$readme);
?></div></td><?php
} else {
?><td>Files don't have descriptions, but can be tested directly from this page.</td><?php
}
?><td><?php
if($zip->add($file->getFilename()) == 0)
die("Error : " . $zip->errorInfo(false));
echo '<a href="'.$zip.'">'.$zip.'</a>';
?></td></tr><?php
}
}
?>
</table>
</body>
</html>
Gewijzigd op 16/12/2010 09:54:58 door Ewergreen php
Ik tel geen 59 regels code in je script.
De fout is vrij simpel. Je geeft ERGENS een object mee ( je PclZip object ) waar eigenlijk een string verwacht wordt. Er zit geen standaard return waarde voor een String in. Als je de juiste regelcode aan ons geeft, kunnen we eens kijken waar je de fout in gaat.
- Aar - op 15/12/2010 19:09:55:
Ik tel geen 59 regels code in je script.
Require is een vorm van include. Het enige verschil is dat require verplicht is (het script stopt als er wat mis is), bij include is dat niet het geval.
Zoals de naam al zegt wordt er bij een include het bestand opgenomen. De aantal regels van de include moet je dus vanaf de plek van de include optellen.
Is er op regel 2 van bestand A een include van 2 regels? Dat betekend dan dat de volgende regel van bestand A op regel 5 staat. Eerst stond de volgende regel op regel 3. Toen zijn er 2 regels bij gekomen. 2+3 = 5.
Nog even een voorbeeldje van hoe __toString():
Code (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
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
<?php
class TestClasseZonderToString {
public $blaat;
function __construct($blaat) {
$this->blaat = $blaat; // Veld zetten
}
}
class TestClassMetToString extends TestClasseZonderToString {
function __construct($blaat) {
parent::__construct($blaat);
}
public function __toString()
{
return $this->blaat;
}
}
$oMetToString = new TestClassMetToString('Blaat');
$oZonderToString = new TestClasseZonderToString('blup');
echo $oMetToString;
echo $oZonderToString;
/* Dit levert:
Blaat
( ! ) Catchable fatal error: Object of class TestClasseZonderToString could not be converted to string
*/
?>
class TestClasseZonderToString {
public $blaat;
function __construct($blaat) {
$this->blaat = $blaat; // Veld zetten
}
}
class TestClassMetToString extends TestClasseZonderToString {
function __construct($blaat) {
parent::__construct($blaat);
}
public function __toString()
{
return $this->blaat;
}
}
$oMetToString = new TestClassMetToString('Blaat');
$oZonderToString = new TestClasseZonderToString('blup');
echo $oMetToString;
echo $oZonderToString;
/* Dit levert:
Blaat
( ! ) Catchable fatal error: Object of class TestClasseZonderToString could not be converted to string
*/
?>
language.oop5.magic#language.oop5.magic.tostring
Hieronder ook het stukje in de pclzip.lib library waar ik denk dat het fout gaat.
Code (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
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
<?php // ----- Init
$v_string_list = array();
$v_att_list = array();
$v_filedescr_list = array();
$p_result_list = array();
// ----- Look if the $p_filelist is really an array
if (is_array($p_filelist)) {
// ----- Look if the first element is also an array
// This will mean that this is a file description entry
if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
$v_att_list = $p_filelist;
}
// ----- The list is a list of string names
else {
$v_string_list = $p_filelist;
}
}
// ----- Look if the $p_filelist is a string
else if (is_string($p_filelist)) {
// ----- Create a list from the string
$v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
}
// ----- Invalid variable type for $p_filelist
else {
PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");
return 0;
}?>
$v_string_list = array();
$v_att_list = array();
$v_filedescr_list = array();
$p_result_list = array();
// ----- Look if the $p_filelist is really an array
if (is_array($p_filelist)) {
// ----- Look if the first element is also an array
// This will mean that this is a file description entry
if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
$v_att_list = $p_filelist;
}
// ----- The list is a list of string names
else {
$v_string_list = $p_filelist;
}
}
// ----- Look if the $p_filelist is a string
else if (is_string($p_filelist)) {
// ----- Create a list from the string
$v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
}
// ----- Invalid variable type for $p_filelist
else {
PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");
return 0;
}?>
Zie dan mijn voorbeeld.
En concludeer dan dat wat je doet niet klopt.
De PclZip klasse heeft geen magic __toString methode.
Toevoeging op 16/12/2010 11:29:09:
Ok, hier kom ik niet uit. Heb op php.net opgezocht wat de magic __toString methode doet en dan geprobeerd deze in mijn pclzip.lib.php file te plaatsen, maar dit maakt het precies erger. Simpelweg: dit is nog te moeilijk voor mij.
Enige kans dat je even kunt zeggen wat ik precies moet doen, dan is het tenminste afgewerkt zoals ik het gehoopt had.