# how do you create a private property as an array in a class

- Thread: https://externals.io/message/59437
- Original archive: https://news-web.php.net/php.internals/59437
- Started by Matthew Hernandez on 2012-04-07T18:23:19+00:00
- Messages: 8
- Reply by email to internals@lists.php.net
- More for agents: search with https://externals.io/search.md?q={query} · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

---

## #59437 — Matthew Hernandez — 2012-04-07T18:23:19+00:00

URL: https://externals.io/message/59437#59437

Hi,

This is my first extension I'm working on. I'm trying to make a class
available to the user space with 1 private property that is an array.

I posted my source and question here
http://stackoverflow.com/questions/10052739/how-do-you-create-a-private-property-as-an-array-in-a-class-within-php-ext

I think I'm going in the right direction. Can someone please help?

thank you

---

## #59444 — johannes@schlueters.de — 2012-04-07T21:27:06+00:00

URL: https://externals.io/message/59437#59444 · In reply to: #59437

Hi,


> This is my first extension I'm working on. I'm trying to make a class
> available to the user space with 1 private property that is an array.

The first question is: Why? - Why add the overhead of creating such an
array if it is private? In most cases it is better to extend the
zend_object in C (struct my_object { zend_object inner; type
some_data;}) to hold private data. If you want to show it in var_dump or
a debugger you could implement a debug_info hook.
	
johannes

---

## #59445 — Matthew Hernandez — 2012-04-07T21:38:09+00:00

URL: https://externals.io/message/59437#59445 · In reply to: #59444

Hi Johannes,

Yes I just found out that I should extend instead of the approach I was
thinking about.

So I created this:

typedef struct _foo_object {
  zend_object std;
  zval  *array;
  int size;
} foo_object;

So the question is how do I correctly pass foo_object around so that I can
manipulate *array ? Having a private variable would mean calling  getThis()
and handling it that way would be trivial.

Are there any examples I could see? I'm using the slides from your
presentation in 2009 to help me.

thanks

On Sat, Apr 7, 2012 at 2:27 PM, Johannes Schlüter <johannes@schlueters.de>wrote:

> Hi,
>
> 
> > […]
>
> The first question is: Why? - Why add the overhead of creating such an
> array if it is private? In most cases it is better to extend the
> zend_object in C (struct my_object { zend_object inner; type
> some_data;}) to hold private data. If you want to show it in var_dump or
> a debugger you could implement a debug_info hook.
>
> johannes

---

## #59448 — Matthew Hernandez — 2012-04-07T23:11:58+00:00

URL: https://externals.io/message/59437#59448 · In reply to: #59445

Here's what I have so far:

typedef struct _foo_class_object {
  zend_object std;
  zval  *elements;
  int size;
} foo_class_object;

static foo_class_object *foo_class_object_ptr;
static zend_class_entry *foo_class_ptr;

ZEND_METHOD(foo_class, __construct) {
  foo_class_object_ptr = (foo_class_object
*)zend_object_store_get_object(getThis() TSRMLS_CC);

  array_init(foo_class_object_ptr->elements);
}

ZEND_METHOD(foo_class, add) {
  zval *this = getThis();
  zval *item;

  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &item) ==
FAILURE) {
    RETURN_FALSE;
  }

  add_next_index_zval(foo_class_object_ptr->elements, item);

  RETURN_TRUE;
}

However, this doesn't work. when you call FooClass::add it causes a
segfault. I'm sure I'm abusing something :)

thx

On Sat, Apr 7, 2012 at 2:38 PM, Matthew Hernandez <proxilabs@gmail.com>wrote:

> Hi Johannes,
>
> Yes I just found out that I should extend instead of the approach I was
> thinking about.
>
> So I created this:
>
> typedef struct _foo_object {
>   zend_object std;
>   zval  *array;
>   int size;
> } foo_object;
>
> So the question is how do I correctly pass foo_object around so that I can
> manipulate *array ? Having a private variable would mean calling  getThis()
> and handling it that way would be trivial.
>
> Are there any examples I could see? I'm using the slides from your
> presentation in 2009 to help me.
>
> thanks
>
> On Sat, Apr 7, 2012 at 2:27 PM, Johannes Schlüter <johannes@schlueters.de>wrote:
>
> > […]

---

## #59450 — Xinchen Hui — 2012-04-08T03:41:31+00:00

URL: https://externals.io/message/59437#59450 · In reply to: #59448

hi：
  You can refer to ext spl array

Thanks

Sent from my iPhone

在 2012-4-8，7:12，Matthew Hernandez <proxilabs@gmail.com> 写道：

> Here's what I have so far:
>
> typedef struct _foo_class_object {
> zend_object std;
> zval  *elements;
> int size;
> } foo_class_object;
>
> static foo_class_object *foo_class_object_ptr;
> static zend_class_entry *foo_class_ptr;
>
> ZEND_METHOD(foo_class, __construct) {
> foo_class_object_ptr = (foo_class_object
> *)zend_object_store_get_object(getThis() TSRMLS_CC);
>
> array_init(foo_class_object_ptr->elements);
> }
>
> ZEND_METHOD(foo_class, add) {
> zval *this = getThis();
> zval *item;
>
> if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &item) ==
> FAILURE) {
>   RETURN_FALSE;
> }
>
> add_next_index_zval(foo_class_object_ptr->elements, item);
>
> RETURN_TRUE;
> }
>
> However, this doesn't work. when you call FooClass::add it causes a
> segfault. I'm sure I'm abusing something :)
>
> thx
>
> On Sat, Apr 7, 2012 at 2:38 PM, Matthew Hernandez <proxilabs@gmail.com>wrote:
>
> > […]

---

## #59453 — Matthew Hernandez — 2012-04-08T06:36:42+00:00

URL: https://externals.io/message/59437#59453 · In reply to: #59450

Thanks.

How can I valgrind my extension? Google isn't bringing up many php
extension topics :/

I can't figure out why I keep getting a seg fault:

typedef struct _foo_object {
  zend_object std;
  zval  *elements;
} foo_object;

static foo_object *foo_object_ptr;

PHP_MINIT_FUNCTION(foo_class)
{
  foo_object_ptr = emalloc(sizeof(foo_object));

  MAKE_STD_ZVAL(foo_object_ptr->elements);
  array_init(foo_object_ptr->elements);

  return SUCCESS;
}

MAKE_STD_ZVAL(foo_object_ptr->elements);
array_init(foo_object_ptr->elements);

These two lines are causing the seg fault, I'm trying to understand why.



> hi：
>  You can refer to ext spl array
>
> Thanks
>
> Sent from my iPhone
>
> 在 2012-4-8，7:12，Matthew Hernandez <proxilabs@gmail.com> 写道：
>
> > […]
> can
> > […]
>  getThis()
> > […]
> johannes@schlueters.de>wrote:
> > […]
> or
> > […]

---

## #59454 — Derick Rethans — 2012-04-08T09:26:55+00:00

URL: https://externals.io/message/59437#59454 · In reply to: #59453

> How can I valgrind my extension? Google isn't bringing up many php 
> extension topics :/

On the shell:

export USE_ZEND_ALLOC=0
export ZEND_DONT_UNLOAD_MODULES=1
valgrind php -dextension=yourextension.so yourscript.php

See for some more info here:
http://derickrethans.nl/valgrinding-shared-modules.html

> I can't figure out why I keep getting a seg fault:
> 
> typedef struct _foo_object {
>   zend_object std;
>   zval  *elements;
> } foo_object;
> 
> static foo_object *foo_object_ptr;

You really want to avoid real globals like this though, as it makes 
things not thread-safe.

Also, please don't top-reply on this list.

cheers,
Derick

-- 
http://derickrethans.nl | http://xdebug.org
Like Xdebug? Consider a donation: http://xdebug.org/donate.php
twitter: @derickr and @xdebug

---

## #59468 — Matthew Hernandez — 2012-04-08T20:00:53+00:00

URL: https://externals.io/message/59437#59468 · In reply to: #59454

> 
>
> > […]
>
> On the shell:
>
> export USE_ZEND_ALLOC=0
> export ZEND_DONT_UNLOAD_MODULES=1
> valgrind php -dextension=yourextension.so yourscript.php
>
> See for some more info here:
> http://derickrethans.nl/valgrinding-shared-modules.html


thanks, this solved the seg fault issue in no time.


>
>
> > […]
>
> You really want to avoid real globals like this though, as it makes
> things not thread-safe.
>

thanks, I'll avoid doing it like this.

Which reminds me. Would you happen to have a "best practices" for
php-extension development that I could reference? I've found a few articles
around, mostly out dated.


> Also, please don't top-reply on this list.
>

sorry.


>
> cheers,
> Derick
>
> --
> http://derickrethans.nl | http://xdebug.org
> Like Xdebug? Consider a donation: http://xdebug.org/donate.php
> twitter: @derickr and @xdebug
