Im currently trying to make a little dice game in php. Right now Im trying to make a "currentscore" where all the points from a rand(1,6) are stacked into a single variable.
Here is the class Im doing this in:
<?php
class CDice {
public $roll;
public $currentscore;
public function Roll()
{
$this->roll = rand(1,6);
return $this->roll;
}
public function currentScore()
{
$this->currentscore += $this->roll;
return $this->currentscore;
}
}
I don't under stand why $this->currentscore += $this->roll; doesn't work.
You do realise that at the end of execution of this class no values are kept right? If you wish to transfer over this data to the next page render, you should use PHP sessions.
<?php
class CDice {
public $roll;
public $currentscore = 0;
public function Roll(){
$this->roll = rand(1,6);
$this->currentscore += $this->roll;
return $this->roll;
}
public function currentScore(){
return $this->currentscore;
}
public function __construct(){
if(session_status() == PHP_SESSION_ACTIVE){
$this->currentscore = isset($_SESSION['dice.score']) ? $_SESSION['dice.score'] ? 0;
# In PHP 7.0
# $this->currentscore = $_SESSION['dice.score'] ?? 0;
} else {
echo 'session has not been initiated';
}
}
}
session_start();
$tmp = new CDice();
echo $tmp->Roll();
echo $tmp->Roll();
echo $tmp->currentScore();
?>
Also not assigning an "initalial" value to a variable before trying to add things to it with +=, -=, etc causes PHP to throw a warning.
Related
Working on a project of translating website and I had chose this solution
.
I'm trying to accomplish something like :
$VAR1 = $translate->__('Word_To_Translate');
This, not works for me since, the result is directly shown in stdout of the webpage. Even so when trying to call $VAR1 no result is returned.
This is not easily possible with the class you've mentioned.
If you wish to edit the class so it'll return the value instead of echoing it, you can edit class.translation.php, replace the two occurances of echo $str; with return $str;, and replace echo $this->lang[$this->language][$str]; with return $this->lang[$this->language][$str] (simply changing echo to return on both instances).
//$VAR1 delegating
$VAR1 = $translate->__('Word_To_Translate');
//class.translation.php
`class Translator {
private $language = 'en';
private $lang = array();
public function __construct($language){
$this->language = $language;
}
private function findString($str) {
if (array_key_exists($str, $this->lang[$this->language])) {
return $this->lang[$this->language][$str];
return;
}
return $str;
}
private function splitStrings($str) {
return explode('=',trim($str));
}
public function __($str) {
if (!array_key_exists($this->language, $this->lang)) {
if (file_exists($this->language.'.txt')) {
$strings = array_map(array($this,'splitStrings'),file($this->language.'.txt'));
foreach ($strings as $k => $v) {
$this->lang[$this->language][$v[0]] = $v[1];
}
return $this->findString($str);
}
else {
return $str;
}
}
else {
return $this->findString($str);
}
}
}`
Switched the echo for a return
Thank you very much uri2x && Rizier123.
For the moment looks that it is working solution.
Best wishes !
I'm having some real trouble with this, and I can't seem to figure out why. Please see code below. As you can see I have an array for $serverDrives set to 'C' and 'F'. I have a loop to create a new Object from a class (Drive) however when I use GetDriveLetter on the drivesArray it will always return F no matter what index I've used. I've checked that in the for loop it has both C and F, but no matter what I do I can't get it to return anything but F.
$serverDrives = ['C', 'F'];
$drivesArray = [];
for($i = 0; $i < count($serverDrives); $i++) {
$drivesArray[$i] = new Drive($serverDrives[$i]);
}
echo $drivesArray[0]->GetDriveLetter();
Here is Drive.class.php:
<?php
class Drive {
public $DriveLetter;
public function Drive($driveletter) {
global $DriveLetter;
$DriveLetter = $driveletter;
}
public function GetDriveLetter() {
global $DriveLetter;
return $DriveLetter;
}
}
Any ideas?
Change your class code to this:
class Drive {
public $DriveLetter;
public function Drive($driveletter) {
$this->DriveLetter = $driveletter;
}
public function GetDriveLetter() {
return $this->DriveLetter;
}
}
I want to create a class that can remove duplicate items but uses pthreads I have an array with some duplicated lines and put them into a thread each line and here is my code.
header("Content-type: text/plain");
class Arr {
public $my_variable = array();
public function add($value) {
$this->my_variable[$value] = 1;
return $this->my_variable;
}
public function check($value)
{
if(isset($this->my_variable[$value])){
return true;
} else {
return false;
}
}
}
class workerThread extends Thread
{
public $arr;
public function __construct($i){
$this->i = str_replace("\r","",$i);
$this->i = str_replace("\n","",$this->i);
$this->arr = new Arr();
}
public function run()
{
if($this->arr->check($this->i)!==true)
{
$add = $this->arr->add($this->i);
echo date('H:i:s') . ' - '. $this->i . " - (".count($add).")\r\n";
}
}
}
$mailExp = array(
'talunays#gmail.com',
'talunays#gmail.com',
'talunays#gmail.com',
'talunays#gmail.com',
'talunays#gmail.com'
);
$total = count($mailExp);
for($i=0;$i<$total-1;$i++)
{
$workers[$i]=new workerThread($mailExp[$i]);
$workers[$i]->start();
}
But it doesn't work, duplicate lines still there and cannot be removed...
You should use construct only to set your private $this variables.
Make the logic inside the run function and use array_unique.
Let the workers come back with join() and retrieve the unduplicated arrays at this point.
I'm having hard time accomplishing one simple task. I have a method that would generate random number and depending on the outcome assign specific outcome to an array variable. What i want to do is get that array variable through instance method which would be called from the other class.
<?php
class MyClass
{
public $results = array(array());
public function simulated_games()
{
$game_series1=array(23,34,56);
$game_series2=array(31,42,67);
$iter_wins=array(array());
for($i=0; $i<10;$i++)
{
$random = rand(0,100);
for($b=0; $b<1;$b++)
{
if($random <= $game_series1[0])
{
$iter_wins[$i][$b]=3;
}
else if($random <= $game_series2[0]+$game_series2[1])
{
$iter_wins[$i][$b]=1;
}
}
}
$results=$iter_wins;
}
>here i create method just to return variable
public function get_simulated_games()
{
return $this->results;
}
}
<?php
$a= new MyClass();
$a->simulated_games();
$array = array();
>here is the issue, it return just 1, but supposed to return range numbers
$array=$a->get_simulated_games();
for($f=0; $f<sizeof($array);$f++)
{
for($g=0; $g<5;$g++)
{
echo $array[$f][$g];
}
echo '<br>';
}
?>
You have the error in results.
You modify interal function variable which is not set instead of class variable
change
$results=$iter_wins;
to
$this->results=$iter_wins;
Basically, what I want to do is create a class called Variables that uses sessions to store everything in it, allowing me to quickly get and store data that needs to be used throughout the entire site without working directly with sessions.
Right now, my code looks like this:
<?php
class Variables
{
public function __construct()
{
if(session_id() === "")
{
session_start();
}
}
public function __set($name,$value)
{
$_SESSION["Variables"][$name] = $value;
}
public function __get($name)
{
return $_SESSION["Variables"][$name];
}
public function __isset($name)
{
return isset($_SESSION["Variables"][$name]);
}
}
However, when I try to use it like a natural variable, for example...
$tpl = new Variables;
$tpl->test[2] = Moo;
echo($tpl->test[2]);
I end up getting "o" instead of "Moo" as it sets test to be "Moo," completely ignoring the array. I know I can work around it by doing
$tpl->test = array("Test","Test","Moo");
echo($tpl->test[2]);
but I would like to be able to use it as if it was a natural variable. Is this possible?
You'll want to make __get return by reference:
<?php
class Variables
{
public function __construct()
{
if(session_id() === "")
{
session_start();
}
}
public function __set($name,$value)
{
$_SESSION["Variables"][$name] = $value;
}
public function &__get($name)
{
return $_SESSION["Variables"][$name];
}
public function __isset($name)
{
return isset($_SESSION["Variables"][$name]);
}
}
$tpl = new Variables;
$tpl->test[2] = "Moo";
echo($tpl->test[2]);
Gives "Moo".