[php] Gebruik van $this wanneer niet in object mode *

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Geachte tweakers,
Onderstaande code werkt uit het niets niet meer, ik zie dat m'n vriendelijke provider geupdate heeft naar 5.2.0. en dus zal het hier wel mee te maken hebben:

PHP:
1
2
3
4
5
foreach ($GLOBALS[HTTP_GET_VARS] as $_get_name => $_get_value) {
if ($_get_name != $this->offset) {
 $this->_get_vars .= "&$_get_name=$_get_value";
}
 }


Iemand een idee waar te beginnen met zoeken? Mn hele website ligt nu plat en daar ben ik niet blij mee. Ik denk zelf aan het declareren van de class maar weet het niet zeker en mn kennis van de nieuwe versie 5 is er helemaal niet.. Moet alles , zet zoals in asp, alle variabelen gedeclareerd worden?
Alle hulp is welkom, het liefst een werkende code, ik weet het: zoek zelf ook, dat ben ik aan het doen maar ik wil zo snel mogelijk mn website weer in de lucht hebben...

Alvast bedankt voor jullie hulp!

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Welke regel geeft een error.

het is nu $_GET[] ipv $GLOBALS[HTTP_GET_VARS]

Je script is gewoon oud.

en nu is het this::

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Wat zeggen de warnings en heb ju uberhaupt de (private?) variabele _get_vars gedefinieerd? Zo nee, wat levert dat dan op?

/edit: en inderdaad, sinds php5 kan je this:: gebruiken. Misschien is this-> nu van deprecated naar unusable gegaan?

[ Voor 32% gewijzigd door mithras op 12-02-2007 13:16 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor de snelle reacties:
Hij geeft de fout op regel 2.

Als ik $_GET[] ipv $GLOBALS[HTTP_GET_VARS] aanpas dan de melding op:
Invalid argument supplied for foreach() in... op regel 1.
Verandering van $this-> naar $this:: geeft syntax error.

De declatie vam HTTP_GET_VARS is volgens mij niet extra gedefnieerd (dat hoefde toch ook niet?)
De declaraties van offset zijn:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$conn = mysql_connect($host,$loginnaam,$wachtwoord);

   mysql_select_db('databasenaam');

   $db = new buildNav;

   $db->offset = 'offset';

   $db->number_type = 'number' ;

   $db->limit = $limit;
   
  $myrow_count = 0; 
  
  
$db->execute($SQLSTMT);

[ Voor 7% gewijzigd door Verwijderd op 12-02-2007 18:05 ]


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

offtopic:
code kan tussen [php][/] of [code=php][/] tags ;)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • sariel
  • Registratie: Mei 2004
  • Laatst online: 22-05-2024
verander $GET[] naar $GET.
$this:: impliceert een class die "$this" heet. gaat dus niet werken.

Copy.com


Acties:
  • 0 Henk 'm!

Verwijderd

Zit je wel eens in een class te werken? Zo niet dan kun je (sinds 5.2.0) ook geen $this gebruiken.. Hernoem de variabel $this eens naar $ietsanders

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
sariel schreef op maandag 12 februari 2007 @ 13:30:
verander $GET[] naar $GET.
$this:: impliceert een class die "$this" heet. gaat dus niet werken.
Dit aangepast levert op regel 2 de melding op:
Warning: Invalid argument supplied for foreach() in

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op maandag 12 februari 2007 @ 13:31:
Zit je wel eens in een class te werken? Zo niet dan kun je (sinds 5.2.0) ook geen $this gebruiken.. Hernoem de variabel $this eens naar $ietsanders
zit niet in een class te werken, ik zal het eens aanpassen.
maar aan de andere kant:
offset is wel onderdeel van class $db = new buildNav; (zie mijn post hierboven) Dit is de class:
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
 class buildNav // [Class : Controls all Functions for Prev/Next Nav Generation]

    {

        var $limit, $execute, $query;

        function execute($query) // [Function : mySQL Query Execution]

        {

            !isset($_GET[$this->offset]) ? $GLOBALS[$this->offset] = 0 : $GLOBALS[$this->offset] = $_GET[$this->offset];

            $this->sql_result = mysql_query($query);

            $this->total_result = mysql_num_rows($this->sql_result);

            if(isset($this->limit))

            {

                $query .= " LIMIT " . $GLOBALS[$this->offset] . ", $this->limit";

                $this->sql_result = mysql_query($query);

                $this->num_pages = ceil($this->total_result/$this->limit);

            }

        }

[ Voor 59% gewijzigd door Verwijderd op 12-02-2007 18:06 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Warning: Invalid argument supplied for foreach() in
Volgens mij is de $_GET dan leeg.
Het is trouwens $_GET en niet $GET

Maak er dus even $_GET van en als die nog steeds de foutmelding
geeft moet je even print_r($_GET); proberen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op maandag 12 februari 2007 @ 13:39:
[...]


Volgens mij is de $_GET dan leeg.
Het is trouwens $_GET en niet $GET

Maak er dus even $_GET van en als die nog steeds de foutmelding
geeft moet je even print_r($_GET); proberen.
Dit heeft de foutmelding van de invalid adgument opgelost, maar zit nu nog met de $this verhaal..

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
foreach ($GLOBALS[HTTP_GET_VARS] as $_get_name => $_get_value) {
   if ($_get_name != $this->offset) {
      $this->_get_vars .= "&$_get_name=$_get_value";
   }
}


Staat deze code in een Class definitie?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op maandag 12 februari 2007 @ 13:47:
PHP:
1
2
3
4
5
foreach ($GLOBALS[HTTP_GET_VARS] as $_get_name => $_get_value) {
if ($_get_name != $this->offset) {
 $this->_get_vars .= "&$_get_name=$_get_value";
}
}


Staat deze code in een Class definitie?
Nee, deze staat niet in een class definitie. (http_get_vars is toch een standaard functie van php?)

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op maandag 12 februari 2007 @ 13:48:
[...]

Nee, deze staat niet in een class definitie. (http_get_vars is toch een standaard functie van php?)
Ja maar het gaat om $this en dat slaat op het object binnen de class -> lees: www.php.net

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb geprobeerd $this te vervangen door een andere naam. Dit loste wel het probleem van de foutmeldingen op maar de gehele functionaliteit was is kwijt. Wat is nu het beste om te doen:
Ik heb 2 pagina's waarvan 1 include met een twee classes die allebij op de manier zoals hierboven zijn opgebouwd. Ik overzie nu even niet wat de juiste aanpak ik. kunnen jullie mij aub op weg helpen.
Ik post hieronder de kleinste class die gebruikt wordt aan de hand van een werkend model van deze class ben ik in staat om de rest te kunnen aanpassen. Ik ben niet snel van het opgeven maar haast en geen kennis van de ontwikkelingen van de nieuwe php versie doen mij de das om.
Voor iedereen die er wat tijd aan wil besteden: mijn dank ik erg, erg groot.
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
class buildNav // [Class : Controls all Functions for Prev/Next Nav Generation]

    {

        var $limit, $execute, $query;

        function execute($query) // [Function : mySQL Query Execution]

        {

            !isset($_GET[$this->offset]) ? $GLOBALS[$this->offset] = 0 : $GLOBALS[$this->offset] = $_GET[$this->offset];

            $this->sql_result = mysql_query($query);

            $this->total_result = mysql_num_rows($this->sql_result);

            if(isset($this->limit))

            {

                $query .= " LIMIT " . $GLOBALS[$this->offset] . ", $this->limit";

                $this->sql_result = mysql_query($query);

                $this->num_pages = ceil($this->total_result/$this->limit);

            }

        }

Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
Verwijderd schreef op maandag 12 februari 2007 @ 18:16:
Ik heb geprobeerd $this te vervangen door een andere naam. Dit loste wel het probleem van de foutmeldingen op maar de gehele functionaliteit was is kwijt. Wat is nu het beste om te doen:
Ik heb 2 pagina's waarvan 1 include met een twee classes die allebij op de manier zoals hierboven zijn opgebouwd. Ik overzie nu even niet wat de juiste aanpak ik. kunnen jullie mij aub op weg helpen.
Ik post hieronder de kleinste class die gebruikt wordt aan de hand van een werkend model van deze class ben ik in staat om de rest te kunnen aanpassen. Ik ben niet snel van het opgeven maar haast en geen kennis van de ontwikkelingen van de nieuwe php versie doen mij de das om.
Voor iedereen die er wat tijd aan wil besteden: mijn dank ik erg, erg groot.
..
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
class buildNav // [Class : Controls all Functions for Prev/Next Nav Generation]

    {

        var $limit, $offset, $sql_result, $total_result, $num_pages;

        function execute($query) // [Function : mySQL Query Execution]

        {

            !isset($_GET[$this->offset]) ? $GLOBALS[$this->offset] = 0 : $GLOBALS[$this->offset] = $_GET[$this->offset];

            $this->sql_result = mysql_query($query);

            $this->total_result = mysql_num_rows($this->sql_result);

            if(isset($this->limit))

            {

                $query .= " LIMIT " . $GLOBALS[$this->offset] . ", $this->limit";

                $this->sql_result = mysql_query($query);

                $this->num_pages = ceil($this->total_result/$this->limit);

            }

        }

Zoiets??

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Robbert, dit verandert niets aan mij $this probleem. Het is inderdaad wel netter alle variabelen te declareren.

Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
Verwijderd schreef op maandag 12 februari 2007 @ 18:31:
Robbert, dit verandert niets aan mij $this probleem. Het is inderdaad wel netter alle variabelen te declareren.
Ik dacht dat php dat sinds 5.2 wel verplicht stelde, niet dus. Maar ik snap echt niet wat aan bovenstaande code fout is. Iets als
PHP:
1
2
$b = new buildNav();
$b->execute("SELECT blaat FROM blaat");

werkt hier gewoon.

Daarnaast zie ik de relatie tussen deze code en die in je startpost niet echt.

En wat bedoel je met "niet in object mode", execute gebruiken als een static functiie, dus:
PHP:
1
buildNav::execute("...");

Nogal logisch werkt dat niet, this heeft dan geen enkele betekenis als het een static functie is, dus er geen instantie van die klasse is.

[ Voor 20% gewijzigd door robbert op 12-02-2007 19:12 ]


Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Welke error krijg je precies? Of geeft hij nu foute output of doet ie niks meer?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Robbert,
De foutmelding die ik krijg heeft betrekking op de tweede regel uit de startpost.
PHP:
1
2
3
4
5
6
7
<?php
foreach ($GLOBALS[HTTP_GET_VARS] as $_get_name => $_get_value) {
if ($_get_name != $this->offset) {
 $this->_get_vars .= "&$_get_name=$_get_value";
}
 }
?>

De foutmelding heeft betrekking op $this
PHP:
1
Fatal error: Using $this when not in object context in..regel 2

Het kan liggen aan het niet goed gebruiken van $this (wat wel altijd heeft gewerkt) of aan offset die gebruikt wordt in de class:
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
class buildNav // [Class : Controls all Functions for Prev/Next Nav Generation]

    {

        var $limit, $offset, $sql_result, $total_result, $num_pages;

        function execute($query) // [Function : mySQL Query Execution]

        {

            !isset($_GET[$this->offset]) ? $GLOBALS[$this->offset] = 0 : $GLOBALS[$this->offset] = $_GET[$this->offset];

            $this->sql_result = mysql_query($query);

            $this->total_result = mysql_num_rows($this->sql_result);

            if(isset($this->limit))

            {

                $query .= " LIMIT " . $GLOBALS[$this->offset] . ", $this->limit";

                $this->sql_result = mysql_query($query);

                $this->num_pages = ceil($this->total_result/$this->limit);

            }

        }

De relatie tussen de foutmelding en mijn startpost is dat ik dacht het ook kon liggen aan het gerbuik van offset in dit stukje code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$conn = mysql_connect($host,$loginnaam,$wachtwoord);

   mysql_select_db('databasenaam');

   $db = new buildNav;

   $db->offset = 'offset';

   $db->number_type = 'number' ;

   $db->limit = $limit;
   
  $myrow_count = 0; 
  
  
$db->execute($SQLSTMT);

Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
Verwijderd schreef op maandag 12 februari 2007 @ 19:22:
Robbert,
De foutmelding die ik krijg heeft betrekking op de tweede regel uit de startpost.
PHP:
1
..

De foutmelding heeft betrekking op $this
PHP:
1
Fatal error: Using $this when not in object context in..regel 2

Het kan liggen aan het niet goed gebruiken van $this (wat wel altijd heeft gewerkt) of aan offset die gebruikt wordt in de class:
PHP:
1
..

De relatie tussen de foutmelding en mijn startpost is dat ik dacht het ook kon liggen aan het gerbuik van offset in dit stukje code:
PHP:
1
...
In dat bovenste stukje code heeft this geen betekenis. Volgens de php manual wat $this betekent:
A pseudo-variable, $this is available when a method is called from within an object context. $this is a reference to the calling object
Dat gedoe met offset in buildNav heeft er nogal logisch niks mee te maken.

[ Voor 3% gewijzigd door robbert op 12-02-2007 20:32 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dus als ik je goed begrijp en zoals iemand anders al genoemd heeft: $this veranderen in een andere naam $ietsnaders. Dat geprobeerd te hebben bleven foutmeldingen uit, maar er werd geen query meer uitgevoerd. Voordat ik het vergeet te zeggen: onwijs bedankt voor het meedenken! cool!

Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
Wordt dat stuk code ergens ge-include, zodat $this toch ergens op slaat?

Wellicht werd elders in de code dat object gemaakt, maar lukt dat nu om een of andere reden niet meer en is dit de eerste plek waar dat problemen oplevert.
:? Geen idee waar je het over hebt. Linkje?

In de war met self:: wellicht? Dan heb je het evenwel over statische context. Lijkt me geen verband met de voorgelegde vraag te hebben.

Acties:
  • 0 Henk 'm!

Verwijderd

in php 5.2 werkt $this-> nog net zo goed als $this::

Je moet er alleen niet vanuit gaan dat je over die $this:: kunt gebruiken.

Wat ik meestal doe is een kleine wrapper functie maken die het object terug geeft waarmee je dan verder kunt binnen je functie.

Niet zo spectaculair aanzich, maar het voorkomt dat je overal in je code global $object weg hoeft te zetten. Puur ter bevordering van de leesbaarheid dus.

Overigens, en dat is ook persoonlijk vind ik dat je $this eigenlijk alleen maar binnen je class behoort te gebruiken. Daarbuiten gewoon een nette naar er aangeven. $db of $_db voor je database laag bevoorbeeld. Lijkt mierenneuken, maar op het moment dat je wat ingewikkeldere dingen gaat maken en meerdere classes gebruikt loop je gewoon vast als je alles stug met het $this object doet buiten je class :)

[ Voor 1% gewijzigd door Verwijderd op 12-02-2007 21:09 . Reden: paragraafjes gemaakt. ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
thanks Birdie en Bogusje, het hele "vervelende" aan dit verhaal is dat alles werkte tot de upgrade naar 5.2.0. Zoals bogusje schrijft kan $this-> nog steeds werken dus moet ik er alleen niet vanuit gaan dat ik deze kan gebruiken. Dat gezegd te hebben: ik snap er steeds minder van. Waarom kan ik er niet meer vanuit gaan dat ik van $this-> gebruik kan maken? Mijn kennis is niet meer bijgespijkerd sinds de ontwikkeling van de site waar het probleem zich nu voordoet, ik snap de helft van wat jullie zeggen.

Wat moet ik nu doen aan het probleem? Moet ik meer code geven? Het beter uitleggen?

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

$this mag je gewoon niet buiten de context van een klasse gebruiken. Het is een reserved word. Blijkbaar mocht dat eerst wel. Het enige wat je dus hoeft te doen is waar je buiten de context van de klasse $this gebruikt een andere naam gebruiken. Easy as that.

Systeem | Strava


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke Duidelijk! Dit heb ik gedaan en fouten zijn weg, maar geen enkele waarde wordt meer doorgegeven in de post. $GLOBALS[PHP_SELF] geen ook geen resultaat?!?!? Wat is dit allemaal? $_SERVER['PHP_SELF'] geef ook geen resultaat?

Een testje geeft geen enkele waardes :
PHP:
1
2
3
4
echo '<pre>';
print_r($_POST);
echo '</pre>';
die;

[ Voor 20% gewijzigd door Verwijderd op 12-02-2007 22:04 . Reden: testje gedaan ]


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

zet dit eens helemaal bovenin je script. Als je dat nog niet hebt.

PHP:
1
2
error_reporting( E_ALL );
ini_set("display_errors","on");

[ Voor 10% gewijzigd door Brakkie op 12-02-2007 22:16 ]

Systeem | Strava


Acties:
  • 0 Henk 'm!

Verwijderd

Brakkie schreef op maandag 12 februari 2007 @ 21:45:
$this mag je gewoon niet buiten de context van een klasse gebruiken. Het is een reserved word. Blijkbaar mocht dat eerst wel. Het enige wat je dus hoeft te doen is waar je buiten de context van de klasse $this gebruikt een andere naam gebruiken. Easy as that.
Let op, dit is dus meer dan gewoon ff een andere variabele neer kwakken voor je $this. Je moet wel netjes die klasse initializen. ($mijnClass = new class) constructie in je code. Anders werkt het nog steeds niet :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke done!, de class opnieuw geinitialiseerd en $this buiten de class veranderd in een andere variablenaam. Bedankt allen voor de tijd en energie!

Acties:
  • 0 Henk 'm!

Verwijderd

en dan nu verplicht leesvoer: http://www.php.net/manual/en/language.oop5.php

zou eigenlijk vast belied moeten zijn hier. eerst de manual na lezen dan pas een topic openen.
Pagina: 1