这是codeigniter中我的模型的代码。
<?php
$catalogo = (object) array (
"name" => "catalogo",
"url" => "url_catalogo"
);
$categorias = (object)array (
"name" => "categorias",
"titulo" => "varchar_titulo",
);
$novedades = (object)array (
"name" => "novedades",
"titulo" => "varchar_titulo",
"fecha" => "fecha_publicacion",
"descripcion" => "text_descripcion",
"categoria" => "fk_categoria"
);
$img_nov =(object) array (
"name" => "imagenes_novedades",
"url" => "url_img",
"novedad" => "fk_novedad"
);
$marcas = (object) array(
"name" => "marcas",
"titulo" => "varchar_titulo",
"url" => "url_imagen"
);
$img_slide = (object) array (
"name" => "slide_destacados",
"url" => "url_img"
);
$users = (object) array (
"db" => "users",
"user" => "username",
"pass" => "password"
);
class Model extends CI_Model
{
function __construct()
{
parent::__construct();
}
function check_user ( $username, $password )
{
global $users;
if ( $username == "" || $password == "" )
return FALSE;
$hashed_password = md5( $password );
$this->db->where($users->user, $username );
$this->db->where($users->pass, $hashed_password );
$query = $this->db->get($users->name);
if ( $query->num_rows() > 0 )
return TRUE;
return FALSE;
}
/*
* Slide de destacados de la pagina principal.
* no creo que necesitemos mas que esto
*/
function imagenes_slide ( $id = -1 )
{
global $img_slide;
if ( $id == -1 )
$this->db->where( 'id', $id);
$query = $this->db->get( $img_slide->name);
return $query->result_array();
}
function borrar_imagen_slide( $id )
{
global $img_slide;
$image_to_delete = $this->imagenes_slide( $id );
$this->db->where('id', $id);
$this->db->delete($img_slide->name);
return $image_to_delete[0][$img_slide->url];
}
function agregar_imagen_slide( $url )
{
global $img_slide;
$this->db->insert( $img_slide->name, array( $img_slide->url => $url ));
}
function cambiar_imagen_slide ( $id, $url )
{
global $img_slide;
$this->db->where( 'id', $id );
$this->db->update( $img_slide->name, array( $img_slide->url, $url ) );
}
/*
* Url del catalogo.
*/
function url_catalogo( $id = -1 )
{
global $catalogo;
if ( $id !== -1 )
$this->db->where( 'id', $id );
$query = $this->db->get( $catalogo->name );
return $query->result_array();
}
function add_catalogo ( $url )
{
global $catalogo;
$this->db->insert( $catalogo->name, array( $catalogo->url, $url) );
}
function remove_catalogo ( $id )
{
global $catalogo;
$url_catalogo = $this->url_catalogo( $id );
$this->db->where( 'id', $id );
$this->db->delete( $catalogo->name );
# Es solo que queremos el primero, ya que buscamos por id
# y este es unico.
return $url_catalogo[0][$catalogo->url];
}
function update_catalogo ( $id, $url )
{
global $catalogo;
$this->db->where( 'id', $id );
$this->db->update( $catalogo->name, array( $catalogo->url, $url ) );
}
/*
* Marcas.
*/
function get_marcas ( $id = -1)
{
global $marcas;
if( $id !== -1 )
$this->db->where( 'id', $id );
$query = $this->db->get( $marcas->name );
return $query->result_array();
}
function add_marca ( $titulo, $url )
{
global $marcas;
$n = array( $marcas->titulo => $titulo, $marcas->url => $url );
$this->db->insert( $marcas->name, $n );
}
function remove_marca ( $id )
{
global $marcas;
# Get the url to delete the image
$url_to_delete = $this->get_marcas( $id );
$this->db->where( 'id', $id );
$this->db->delete( $marcas->name );
# Es solo que queremos el primero, ya que buscamos por id
# y este es unico.
return $url_to_delete[0][$marcas->url];
}
function update_marca ( $id, $titulo = FALSE, $url = FALSE )
{
global $marcas;
$to_update = array ();
if ( $titulo != FALSE )
$to_update[$marcas->titulo] = $titulo;
if ( $url != FALSE )
$to_update[$marcas->url] = $url;
if ( $to_update !== array() )
{
$this->db->where( 'id', $id );
$this->db->update($marcas->name, $to_update );
}
}
/*
* Categorias!
*/
function get_categorias ( $id = -1 )
{
global $categorias;
if ( $id != -1 )
$this->db->where('id', $id);
$query = $this->db->get( $categorias->name );
return $query->result_array();
}
function remove_categoria ( $id )
{
global $categorias;
# Conseguimos todos los items de las categorias.
$novedades = $this->get_novedades( $id );
foreach( $novedades as $novedad )
{
$this->delete_novedad ( $novedad["id"] );
}
$this->db->where( 'id', $id );
$this->db->delete( $categorias->name );
}
function add_categoria ( $titulo )
{
global $categorias;
$data = array( $categorias->titulo, $titulo );
$this->db->insert ($categorias->name, $data);
}
function update_categoria ( $id, $titulo )
{
global $categorias;
$this->db->where( 'id', $id);
$this->db->update( $categorias->name, array( $categorias->titulo, $titulo ) );
}
/*
* Novedades ! (Esto va a ser largo)
*/
function get_novedades ( $id_categoria, $id_novedad = FALSE, $offset = FALSE )
{
global $novedades;
$this->db->where( $novedades->categoria, $id_categoria );
if ( $id_novedad !== FALSE )
$this->db->where ( 'id', $id_novedad );
if ( $offset !== FALSE )
$this->db->limit( 10, $offset );
$query = $this->db->get( $novedades->name );
return $query->result_array();
}
function add_novedad ( $titulo, $descripcion, $id_categoria )
{
global $novedades;
# Hay que crear la fecha actual.
$date = new Date();
$to_add = array (
$novedades->titulo => $titulo,
$novedades->fecha => $date,
$novedades->descripcion => $descripcion,
$novedades->categoria => $id_categoria
);
$this->db->insert( $novedades->name, $to_add );
}
function delete_novedad ( $id )
{
global $novedades;
# Y ahora sacamos de la base de datos.
$this->db->where( 'id', $id );
$this->db->delete( $novedades->name );
# Retornamos todas las urls de las imagenes.
}
function update_novedad ( $id, $titulo = FALSE, $descripcion = FALSE )
{
global $novedades;
$to_update = array();
$this->db->where ( 'id' , $id );
if ( $titulo != FALSE )
$to_update[$novedades->titulo] = $titulo;
if ( $descripcion != FALSE )
$to_update[$novedades->descripcion] = $descripcion;
if ( $to_update === array() )
return FALSE;
$this->db->update( $novedades->name, $to_update );
}
/*
* Aca van las imagenes de las novedades.
*/
function get_images_novedad ( $id_novedad, $amount = 0 )
{
global $img_nov;
if ( $amount != 0 )
$this->db->limit( $amount );
$this->db->where( $img_nov->novedad, $id_novedad );
$query = $this->db->get( $img_nov->name );
return $query->result_array();
}
function delete_imagen_novedad ( $id )
{
global $img_nov;
# Primero que nada, eliminamos todas las imagenes. :)
$images = $this->get_imagenes_novedad ( $id );
$to_delete_permantenlty = array();
foreach ( $images as $image )
{
$to_delete_permantenlty[] = $image[$img_nov->url];
}
$this->db->where( $img_nov->novedad, $id );
$this->db->delete( $img_nov->name );
return $to_delete_permantenlty;
}
}
/* End of Model class */
我希望在模型中看到全局范围内的对象。我已经尝试了很多方法来做到这一点。但是没有办法。
当我访问模型时,这是错误的。
Message: Trying to get property of non-object
P.D。:我不想要替代品。我知道替代方案,我可以让它在10分钟内工作:)我只是好奇这是否可行。
答案 0 :(得分:3)
你不能,这是不可能的,甚至连Chuck Norris也无法访问类定义中的全局变量。
你必须将它们传递给构造函数或方法当你需要这些物品时。想一想:OOP背后的整个想法是编写一次代码,可以在任何地方部署,如果代码依赖于全局变量,在全局范围内定义名为$ foo,则代码不能重复使用,除非全局范围具有所需的对象,具有那些特定的名称......如果允许这样做,OOP代码将是调试的地狱:当前,如果您收到错误,说明某些内容未定义,则在x行上一个类文件,你知道你正在尝试访问一个属性。想象一下,不得不涉及每一行代码的恐怖,只是为了找出你写的:$ foo而不是全球$ foo
额外:
只是想到一种hacky方式来实现这一点:将对象分配给超全局变量(如$ _GLOBALS)将为您提供访问权限(可以从类中访问超级全局变量)。但这只是一种糟糕的做法,并且非常容易出错:每个类都可以访问这些对象,并且可能会重新分配或更改数据,因此您无法保证对象仍然存在...
坦率地说,如果您需要访问全局变量,最好花点时间考虑一下实际想要做什么。对于你的,甚至每个人的缘故,你最好选择,或者写一切OO,或者什么都不写。混合两者只会让你最终感到悲痛。
由于您正在使用codeigniter,为什么不花时间去了解框架,并按照预期使用它。这样,你就可以避免重新发明轮子,毕竟:这就是框架的用途:它们为你提供了一个(相当)完善的骨干,可以完成所有繁重的工作,并且不需要这些东西。
只需使用框架并查看MVC模式,这就是我要做的......
编辑:
你得到的错误是绝对有意义的:访问非对象的属性是可取的,因为你不能使用全局变量。 PHP有这种错误沿着的倾向,并试图让它全部工作,所以它可能为你定义了一个局部变量,因为它未被初始化将被赋予NULL,null不是一个对象,因此您无法访问属性。因此:访问非对象的属性。
<强>校正强>
正如@fireeyedboy向我指出的那样,可以这样做(检查链接到键盘的注释)。我仍然认为这是一种可怕的编码方式,甚至会把这称为一个bug,需要尽快压扁。
如果我看到代码相当于氰化物丸,就是这样。编写OO代码,只有在某些全局变量存在的情况下才能起作用才是人类的罪行!